From f03a82d951e96cf97f939cf5960021ff1e512f87 Mon Sep 17 00:00:00 2001 From: odd-amphora Date: Wed, 22 Sep 2021 08:40:24 -0400 Subject: [PATCH] Remove hardhat --- packages/app/.example.env => .example.env | 2 +- .github/workflows/presubmit.yml | 52 - .gitignore | 3 - packages/app/.prettierrc => .prettierrc | 0 .vscode/settings.json | 7 - README.md | 141 +- .../app.template.yaml => app.template.yaml | 0 packages/app/app.yaml => app.yaml | 0 gas.txt | 91 - package.json | 110 +- packages/app/README.md | 46 - packages/app/package.json | 66 - packages/hardhat/.eslintrc.js | 23 - packages/hardhat/.example.env | 1 - packages/hardhat/constants/dai.js | 4 - .../hardhat/constants/eth_usd_price_feed.js | 12 - packages/hardhat/constants/skip-publish.js | 15 - packages/hardhat/constants/weth.js | 12 - .../Active14DaysFundingCycleBallot.sol | 43 - .../Active3DaysFundingCycleBallot.sol | 43 - .../Active7DaysFundingCycleBallot.sol | 43 - .../contracts/DirectPaymentAddress.sol | 72 - .../contracts/ExampleETHUSDPriceFeed.sol | 49 - .../ExampleFailingFundingCycleBallot.sol | 26 - .../contracts/ExampleJuiceboxProject.sol | 20 - .../hardhat/contracts/ExampleModAllocator.sol | 13 - packages/hardhat/contracts/ExampleYielder.sol | 28 - packages/hardhat/contracts/FundingCycles.sol | 1384 - packages/hardhat/contracts/Governance.sol | 67 - packages/hardhat/contracts/ModStore.sol | 272 - packages/hardhat/contracts/OperatorStore.sol | 185 - packages/hardhat/contracts/Prices.sol | 100 - packages/hardhat/contracts/Projects.sol | 332 - .../hardhat/contracts/ProxyPaymentAddress.sol | 89 - .../contracts/ProxyPaymentAddressManager.sol | 85 - .../hardhat/contracts/TerminalDirectory.sol | 177 - packages/hardhat/contracts/TerminalV1.sol | 1405 - packages/hardhat/contracts/TicketBooth.sol | 552 - packages/hardhat/contracts/Tickets.sol | 33 - .../contracts/TokenRepresentationProxy.sol | 33 - packages/hardhat/contracts/YearnYielder.sol | 113 - .../contracts/abstract/JuiceboxProject.sol | 172 - .../hardhat/contracts/abstract/Operatable.sol | 73 - .../contracts/abstract/TerminalUtility.sol | 24 - .../hardhat/contracts/examples/Shwotime.sol | 148 - .../contracts/examples/YourContract.sol | 11 - .../interfaces/IDirectPaymentAddress.sol | 22 - .../interfaces/IFundingCycleBallot.sol | 20 - .../contracts/interfaces/IFundingCycles.sol | 119 - .../contracts/interfaces/IModAllocator.sol | 18 - .../contracts/interfaces/IModStore.sol | 62 - .../contracts/interfaces/IOperatable.sol | 8 - .../contracts/interfaces/IOperatorStore.sol | 44 - .../hardhat/contracts/interfaces/IPrices.sol | 21 - .../contracts/interfaces/IProjects.sol | 92 - .../interfaces/IProxyPaymentAddress.sol | 38 - .../IProxyPaymentAddressManager.sol | 27 - .../contracts/interfaces/ITerminal.sol | 50 - .../interfaces/ITerminalDirectory.sol | 51 - .../contracts/interfaces/ITerminalUtility.sol | 8 - .../contracts/interfaces/ITerminalV1.sol | 184 - .../contracts/interfaces/ITicketBooth.sol | 151 - .../hardhat/contracts/interfaces/ITickets.sol | 10 - .../hardhat/contracts/interfaces/IWETH.sol | 13 - .../hardhat/contracts/interfaces/IYielder.sol | 21 - .../contracts/interfaces/IyVaultV2.sol | 108 - .../contracts/libraries/Operations.sol | 21 - packages/hardhat/hardhat.config.js | 403 - packages/hardhat/package.json | 87 - packages/hardhat/scripts/deployAll.js | 151 - .../deployProxyPaymentAddressManager.js | 68 - packages/hardhat/scripts/publish.js | 129 - packages/hardhat/scripts/utils.js | 52 - packages/hardhat/scripts/watch.js | 18 - packages/hardhat/tasks/deploy.js | 42 - packages/hardhat/test/index.js | 377 - packages/hardhat/test/integration/index.js | 276 - .../integration/workflows/approved_ballot.js | 693 - .../integration/workflows/challenge_handle.js | 405 - .../workflows/currency_conversion.js | 357 - .../test/integration/workflows/deploy.js | 241 - .../workflows/direct_payment_addresses.js | 401 - .../integration/workflows/failed_ballot.js | 756 - .../test/integration/workflows/governance.js | 168 - .../test/integration/workflows/index.js | 61 - .../integration/workflows/issue_tickets.js | 607 - .../workflows/iterated_failed_ballot.js | 761 - .../test/integration/workflows/limit.js | 835 - .../test/integration/workflows/migrate.js | 537 - .../integration/workflows/non_recurring.js | 549 - .../workflows/operator_permissions.js | 906 - .../workflows/print_premined_tickets.js | 610 - .../workflows/print_reserved_tickets.js | 880 - .../test/integration/workflows/projects.js | 617 - .../workflows/proxy_payment_addresses.js | 245 - .../test/integration/workflows/reconfigure.js | 919 - .../test/integration/workflows/redeem.js | 1288 - .../test/integration/workflows/set_fee.js | 550 - .../integration/workflows/set_payout_mods.js | 400 - .../integration/workflows/set_terminal.js | 357 - .../integration/workflows/set_ticket_mods.js | 362 - .../test/integration/workflows/take_fee.js | 271 - .../hardhat/test/integration/workflows/tap.js | 637 - .../workflows/ticket_locking_and transfers.js | 693 - .../workflows/transfer_project_ownership.js | 123 - .../integration/workflows/zero_duration.js | 636 - .../direct_payment_address/behaviors/index.js | 5 - .../behaviors/receive.js | 80 - .../behaviors/direct_payment_address/index.js | 26 - .../funding_cycles/behaviors/configure.js | 1261 - .../behaviors/current_ballot_state_of.js | 651 - .../funding_cycles/behaviors/current_of.js | 757 - .../funding_cycles/behaviors/index.js | 13 - .../funding_cycles/behaviors/queued_of.js | 746 - .../behaviors/funding_cycles/behaviors/tap.js | 1043 - .../unit/behaviors/funding_cycles/index.js | 44 - .../governance/behaviors/add_price_feed.js | 71 - .../governance/behaviors/allow_migration.js | 138 - .../behaviors/appoint_governance.js | 126 - .../behaviors/governance/behaviors/index.js | 11 - .../behaviors/governance/behaviors/set_fee.js | 120 - .../test/unit/behaviors/governance/index.js | 26 - packages/hardhat/test/unit/behaviors/index.js | 29 - .../juice_project/behaviors/index.js | 17 - .../behaviors/juice_project/behaviors/pay.js | 185 - .../juice_project/behaviors/set_operator.js | 93 - .../juice_project/behaviors/set_operators.js | 93 - .../juice_project/behaviors/set_project_id.js | 54 - .../juice_project/behaviors/take_fee.js | 198 - .../behaviors/transfer_project_ownership.js | 89 - .../juice_project/behaviors/withdraw.js | 65 - .../unit/behaviors/juice_project/index.js | 32 - .../behaviors/mod_store/behaviors/index.js | 7 - .../mod_store/behaviors/set_payment_mods.js | 702 - .../mod_store/behaviors/set_ticket_mods.js | 647 - .../test/unit/behaviors/mod_store/index.js | 29 - .../behaviors/has_permission.js | 160 - .../behaviors/has_permissions.js | 178 - .../operator_store/behaviors/index.js | 11 - .../operator_store/behaviors/set_operator.js | 123 - .../operator_store/behaviors/set_operators.js | 278 - .../unit/behaviors/operator_store/index.js | 17 - .../behaviors/prices/behaviors/add_feed.js | 133 - .../prices/behaviors/get_eth_price_for.js | 111 - .../unit/behaviors/prices/behaviors/index.js | 7 - .../test/unit/behaviors/prices/index.js | 22 - .../projects/behaviors/challenge_handle.js | 113 - .../projects/behaviors/claim_handle.js | 422 - .../behaviors/projects/behaviors/create.js | 266 - .../behaviors/projects/behaviors/index.js | 17 - .../projects/behaviors/renew_handle.js | 127 - .../projects/behaviors/set_handle.js | 178 - .../behaviors/projects/behaviors/set_uri.js | 130 - .../projects/behaviors/transfer_handle.js | 197 - .../test/unit/behaviors/projects/index.js | 25 - .../proxy_payment_address/behaviors/index.js | 7 - .../proxy_payment_address/behaviors/tap.js | 78 - .../behaviors/transfer_tickets.js | 51 - .../behaviors/proxy_payment_address/index.js | 29 - .../behaviors/deploy_proxy_payment_address.js | 73 - .../behaviors/index.js | 5 - .../proxy_payment_address_manager/index.js | 26 - .../behaviors/deploy_address.js | 151 - .../terminal_directory/behaviors/index.js | 9 - .../behaviors/set_payer_preferences.js | 48 - .../behaviors/set_terminal.js | 311 - .../behaviors/terminal_directory/index.js | 23 - .../behaviors/accept_governance.js | 64 - .../terminal_v1/behaviors/add_to_balance.js | 107 - .../terminal_v1/behaviors/allow_migration.js | 90 - .../behaviors/appoint_governance.js | 79 - .../terminal_v1/behaviors/configure.js | 341 - .../behaviors/terminal_v1/behaviors/deploy.js | 280 - .../behaviors/terminal_v1/behaviors/index.js | 29 - .../terminal_v1/behaviors/migrate.js | 374 - .../behaviors/terminal_v1/behaviors/pay.js | 260 - .../behaviors/print_premined_tickets.js | 281 - .../behaviors/print_reserved_tickets.js | 294 - .../behaviors/terminal_v1/behaviors/redeem.js | 623 - .../terminal_v1/behaviors/set_fee.js | 70 - .../behaviors/terminal_v1/behaviors/tap.js | 687 - .../test/unit/behaviors/terminal_v1/index.js | 74 - .../ticket_booth/behaviors/balance_of.js | 170 - .../behaviors/ticket_booth/behaviors/index.js | 23 - .../behaviors/ticket_booth/behaviors/issue.js | 176 - .../behaviors/ticket_booth/behaviors/lock.js | 310 - .../behaviors/ticket_booth/behaviors/print.js | 241 - .../ticket_booth/behaviors/redeem.js | 499 - .../behaviors/ticket_booth/behaviors/stake.js | 307 - .../ticket_booth/behaviors/total_supply_of.js | 157 - .../ticket_booth/behaviors/transfer.js | 345 - .../ticket_booth/behaviors/unlock.js | 222 - .../ticket_booth/behaviors/unstake.js | 381 - .../test/unit/behaviors/ticket_booth/index.js | 34 - packages/hardhat/test/unit/index.js | 38 - .../app/public => public}/assets/arrow.png | Bin .../public => public}/assets/banana-cover.png | Bin .../public => public}/assets/banana-od.png | Bin .../public => public}/assets/banana-ol.png | Bin .../public => public}/assets/banana_dwgj.png | Bin .../public => public}/assets/blueberry-ol.png | Bin .../app/public => public}/assets/bolt.png | Bin .../assets/cooler_if_you_did.png | Bin .../assets/fountain_of_juice.png | Bin .../assets/glass_overflow.png | Bin .../assets/juice_logo-od.png | Bin .../assets/juice_logo-ol.png | Bin .../assets/orange_lady-od.png | Bin .../assets/orange_lady-ol.png | Bin .../app/public => public}/assets/pina.png | Bin {packages/app/public => public}/favicon.ico | Bin {packages/app/public => public}/index.html | 0 {packages/app/public => public}/info/1.txt | 0 {packages/app/public => public}/manifest.json | 0 {packages/app/public => public}/robots.txt | 0 {packages/app/src => src}/Network.tsx | 0 {packages/app/src => src}/Theme.tsx | 0 {packages/app/src => src}/User.tsx | 0 .../app/src => src}/components/App.test.tsx | 0 {packages/app/src => src}/components/App.tsx | 0 .../components/CatchallRedirect.tsx | 0 .../components/Create/BudgetForm.tsx | 0 .../Create/ConfirmDeployProject.tsx | 0 .../components/Create/IncentivesForm.tsx | 0 .../components/Create/PayModsForm.tsx | 0 .../components/Create/ProjectForm.tsx | 0 .../components/Create/RulesForm.tsx | 0 .../components/Create/TicketingForm.tsx | 0 .../src => src}/components/Create/index.tsx | 0 .../components/Dashboard/BalanceTimeline.tsx | 0 .../components/Dashboard/FundingCycles.tsx | 0 .../components/Dashboard/FundingHistory.tsx | 0 .../components/Dashboard/IssueTickets.tsx | 0 .../src => src}/components/Dashboard/Paid.tsx | 0 .../src => src}/components/Dashboard/Pay.tsx | 0 .../components/Dashboard/PrintPremined.tsx | 0 .../components/Dashboard/Project.tsx | 0 .../ProjectActivity/PayerReports.tsx | 0 .../ProjectActivity/PaymentActivity.tsx | 0 .../ProjectActivity/RedeemActivity.tsx | 0 .../ProjectActivity/ReservesActivity.tsx | 0 .../ProjectActivity/ReservesEventElem.tsx | 0 .../Dashboard/ProjectActivity/RichNote.tsx | 0 .../Dashboard/ProjectActivity/TapActivity.tsx | 0 .../ProjectActivity/TapEventElem.tsx | 0 .../Dashboard/ProjectActivity/index.tsx | 0 .../Dashboard/ProjectActivity/styles.ts | 0 .../components/Dashboard/ProjectHeader.tsx | 0 .../components/Dashboard/ReservedTokens.tsx | 0 .../components/Dashboard/Rewards.tsx | 0 .../components/Dashboard/SectionHeader.tsx | 0 .../components/Dashboard/Spending.tsx | 0 .../components/Dashboard/index.tsx | 0 .../components/Dashboard/styles.ts | 0 .../FundingCycle/CurrentFundingCycle.tsx | 0 .../FundingCycle/FundingCycleDetails.tsx | 0 .../FundingCycle/FundingCyclePreview.tsx | 0 .../FundingCycle/QueuedFundingCycle.tsx | 0 .../app/src => src}/components/Gimme.tsx | 0 .../components/Landing/DefineProject.tsx | 0 .../src => src}/components/Landing/Faq.tsx | 0 .../src => src}/components/Landing/Footer.tsx | 0 .../src => src}/components/Landing/index.tsx | 0 .../src => src}/components/Navbar/Account.tsx | 0 .../src => src}/components/Navbar/Balance.tsx | 0 .../components/Navbar/EthPrice.tsx | 0 .../components/Navbar/ThemePicker.tsx | 0 .../src => src}/components/Navbar/Wallet.tsx | 0 .../src => src}/components/Navbar/index.tsx | 0 .../src => src}/components/Projects/index.tsx | 0 .../app/src => src}/components/Router.tsx | 0 .../app/src => src}/components/icons/Moon.tsx | 0 .../app/src => src}/components/icons/Sun.tsx | 0 .../components/modals/BalancesModal.tsx | 0 .../modals/ConfirmPayOwnerModal.tsx | 0 .../modals/ConfirmStakeTokensModal.tsx | 0 .../modals/ConfirmUnstakeTokensModal.tsx | 0 .../modals/DistributeTokensModal.tsx | 0 .../components/modals/EditProjectModal.tsx | 0 .../modals/ProjectToolDrawerModal.tsx | 0 .../components/modals/ReconfigureFCModal.tsx | 0 .../components/modals/WithdrawModal.tsx | 0 .../components/shared/CardSection.tsx | 0 .../components/shared/CurrencySymbol.tsx | 0 .../components/shared/ERC20TokenBalance.tsx | 0 .../components/shared/FCNumber.tsx | 0 .../components/shared/FormattedAddress.tsx | 0 .../shared/InputAccessoryButton.tsx | 0 .../src => src}/components/shared/Loading.tsx | 0 .../app/src => src}/components/shared/Mod.tsx | 0 .../components/shared/PayoutModsList.tsx | 0 .../components/shared/ProjectCard.tsx | 0 .../components/shared/ProjectHandle.tsx | 0 .../components/shared/ProjectLogo.tsx | 0 .../components/shared/ProjectTokenBalance.tsx | 0 .../components/shared/ProjectsGrid.tsx | 0 .../components/shared/RichImgPreview.tsx | 0 .../components/shared/TicketModsList.tsx | 0 .../components/shared/TooltipIcon.tsx | 0 .../components/shared/TooltipLabel.tsx | 0 .../src => src}/components/shared/WtfCard.tsx | 0 .../shared/formItems/EthAddress.tsx | 0 .../formItems/ProjectBondingCurveRate.tsx | 0 .../shared/formItems/ProjectDescription.tsx | 0 .../shared/formItems/ProjectDiscountRate.tsx | 0 .../shared/formItems/ProjectDuration.tsx | 0 .../shared/formItems/ProjectHandle.tsx | 0 .../shared/formItems/ProjectLink.tsx | 0 .../shared/formItems/ProjectLogoUrl.tsx | 0 .../shared/formItems/ProjectName.tsx | 0 .../shared/formItems/ProjectPayoutMods.tsx | 0 .../shared/formItems/ProjectReserved.tsx | 0 .../shared/formItems/ProjectTarget.tsx | 0 .../shared/formItems/ProjectTicketMods.tsx | 0 .../components/shared/formItems/TokenRefs.tsx | 0 .../shared/formItems/formItemExt.tsx | 0 .../components/shared/formItems/index.tsx | 0 .../shared/inputs/BudgetTargetInput.tsx | 0 .../shared/inputs/FormattedNumberInput.tsx | 0 .../shared/inputs/ImageUploader.tsx | 0 .../components/shared/inputs/NumberSlider.tsx | 0 .../constants/ballot-strategies.ts | 0 .../app/src => src}/constants/networks.ts | 0 .../src => src}/constants/project-types.ts | 0 .../app/src => src}/constants/readProvider.ts | 0 .../src => src}/constants/styles/colors.ts | 0 .../src => src}/constants/styles/layouts.ts | 0 .../src => src}/constants/styles/padding.ts | 0 .../constants/styles/shadowCard.ts | 0 .../app/src => src}/constants/subgraphs.ts | 0 .../constants/theme/colors/background.ts | 0 .../constants/theme/colors/icon.ts | 0 .../constants/theme/colors/index.ts | 0 .../constants/theme/colors/stroke.ts | 0 .../constants/theme/colors/text.ts | 0 .../app/src => src}/constants/theme/index.ts | 0 .../constants/theme/radius/index.ts | 0 .../constants/theme/theme-option.ts | 0 .../app/src => src}/constants/tokens/dai.ts | 0 .../src => src}/contexts/networkContext.ts | 0 .../src => src}/contexts/projectContext.ts | 0 .../app/src => src}/contexts/themeContext.ts | 0 .../app/src => src}/contexts/userContext.ts | 0 .../Active14DaysFundingCycleBallot.abi.js | 0 .../Active14DaysFundingCycleBallot.address.js | 0 ...Active14DaysFundingCycleBallot.bytecode.js | 0 .../Active7DaysFundingCycleBallot.abi.js | 0 .../Active7DaysFundingCycleBallot.address.js | 0 .../Active7DaysFundingCycleBallot.bytecode.js | 0 .../src => src}/contracts/kovan/Admin.abi.js | 0 .../contracts/kovan/Admin.address.js | 0 .../contracts/kovan/Admin.bytecode.js | 0 .../contracts/kovan/BudgetBallot.abi.js | 0 .../contracts/kovan/BudgetBallot.address.js | 0 .../contracts/kovan/BudgetBallot.bytecode.js | 0 .../contracts/kovan/BudgetStore.abi.js | 0 .../contracts/kovan/BudgetStore.address.js | 0 .../contracts/kovan/BudgetStore.bytecode.js | 0 .../contracts/kovan/DirectPayments.abi.js | 0 .../contracts/kovan/DirectPayments.address.js | 0 .../kovan/DirectPayments.bytecode.js | 0 .../contracts/kovan/FundingCycleBallot.abi.js | 0 .../kovan/FundingCycleBallot.address.js | 0 .../kovan/FundingCycleBallot.bytecode.js | 0 .../contracts/kovan/FundingCycles.abi.js | 0 .../contracts/kovan/FundingCycles.address.js | 0 .../contracts/kovan/FundingCycles.bytecode.js | 0 .../contracts/kovan/Governance.abi.js | 0 .../contracts/kovan/Governance.address.js | 0 .../contracts/kovan/Governance.bytecode.js | 0 .../kovan/JuiceTerminalDirectory.abi.js | 0 .../kovan/JuiceTerminalDirectory.address.js | 0 .../kovan/JuiceTerminalDirectory.bytecode.js | 0 .../src => src}/contracts/kovan/Juicer.abi.js | 0 .../contracts/kovan/Juicer.address.js | 0 .../contracts/kovan/Juicer.bytecode.js | 0 .../contracts/kovan/ModStore.abi.js | 0 .../contracts/kovan/ModStore.address.js | 0 .../contracts/kovan/ModStore.bytecode.js | 0 .../contracts/kovan/OperatorStore.abi.js | 0 .../contracts/kovan/OperatorStore.address.js | 0 .../contracts/kovan/OperatorStore.bytecode.js | 0 .../src => src}/contracts/kovan/Prices.abi.js | 0 .../contracts/kovan/Prices.address.js | 0 .../contracts/kovan/Prices.bytecode.js | 0 .../contracts/kovan/Projects.abi.js | 0 .../contracts/kovan/Projects.address.js | 0 .../contracts/kovan/Projects.bytecode.js | 0 .../contracts/kovan/TerminalDirectory.abi.js | 0 .../kovan/TerminalDirectory.address.js | 0 .../kovan/TerminalDirectory.bytecode.js | 0 .../contracts/kovan/TerminalV1.abi.js | 0 .../contracts/kovan/TerminalV1.address.js | 0 .../contracts/kovan/TerminalV1.bytecode.js | 0 .../contracts/kovan/TicketBooth.abi.js | 0 .../contracts/kovan/TicketBooth.address.js | 0 .../contracts/kovan/TicketBooth.bytecode.js | 0 .../contracts/kovan/TicketStore.abi.js | 0 .../contracts/kovan/TicketStore.address.js | 0 .../contracts/kovan/TicketStore.bytecode.js | 0 .../contracts/kovan/Tickets.abi.js | 0 .../contracts/kovan/Tickets.address.js | 0 .../contracts/kovan/Tickets.bytecode.js | 0 .../contracts/kovan/TimelockStaker.abi.js | 0 .../contracts/kovan/TimelockStaker.address.js | 0 .../kovan/TimelockStaker.bytecode.js | 0 .../src => src}/contracts/kovan/Token.abi.js | 0 .../contracts/kovan/Token.address.js | 0 .../contracts/kovan/Token.bytecode.js | 0 .../src => src}/contracts/kovan/contracts.js | 0 .../Active7DaysFundingCycleBallot.abi.js | 0 .../Active7DaysFundingCycleBallot.address.js | 0 .../Active7DaysFundingCycleBallot.bytecode.js | 0 .../contracts/mainnet/FundingCycles.abi.js | 0 .../mainnet/FundingCycles.address.js | 0 .../mainnet/FundingCycles.bytecode.js | 0 .../contracts/mainnet/Governance.abi.js | 0 .../contracts/mainnet/Governance.address.js | 0 .../contracts/mainnet/Governance.bytecode.js | 0 .../contracts/mainnet/ModStore.abi.js | 0 .../contracts/mainnet/ModStore.address.js | 0 .../contracts/mainnet/ModStore.bytecode.js | 0 .../contracts/mainnet/OperatorStore.abi.js | 0 .../mainnet/OperatorStore.address.js | 0 .../mainnet/OperatorStore.bytecode.js | 0 .../contracts/mainnet/Prices.abi.js | 0 .../contracts/mainnet/Prices.address.js | 0 .../contracts/mainnet/Prices.bytecode.js | 0 .../contracts/mainnet/Projects.abi.js | 0 .../contracts/mainnet/Projects.address.js | 0 .../contracts/mainnet/Projects.bytecode.js | 0 .../mainnet/ProxyPaymentAddressManager.abi.js | 0 .../ProxyPaymentAddressManager.address.js | 0 .../ProxyPaymentAddressManager.bytecode.js | 0 .../mainnet/TerminalDirectory.abi.js | 0 .../mainnet/TerminalDirectory.address.js | 0 .../mainnet/TerminalDirectory.bytecode.js | 0 .../contracts/mainnet/TerminalV1.abi.js | 0 .../contracts/mainnet/TerminalV1.address.js | 0 .../contracts/mainnet/TerminalV1.bytecode.js | 0 .../contracts/mainnet/TicketBooth.abi.js | 0 .../contracts/mainnet/TicketBooth.address.js | 0 .../contracts/mainnet/TicketBooth.bytecode.js | 0 .../contracts/mainnet/contracts.js | 0 .../Active14DaysFundingCycleBallot.abi.js | 0 .../Active14DaysFundingCycleBallot.address.js | 0 ...Active14DaysFundingCycleBallot.bytecode.js | 0 .../Active7DaysFundingCycleBallot.abi.js | 0 .../Active7DaysFundingCycleBallot.address.js | 0 .../Active7DaysFundingCycleBallot.bytecode.js | 0 .../contracts/rinkeby/Admin.abi.js | 0 .../contracts/rinkeby/Admin.address.js | 0 .../contracts/rinkeby/Admin.bytecode.js | 0 .../contracts/rinkeby/BudgetBallot.abi.js | 0 .../contracts/rinkeby/BudgetBallot.address.js | 0 .../rinkeby/BudgetBallot.bytecode.js | 0 .../contracts/rinkeby/BudgetStore.abi.js | 0 .../contracts/rinkeby/BudgetStore.address.js | 0 .../contracts/rinkeby/BudgetStore.bytecode.js | 0 .../contracts/rinkeby/DirectPayments.abi.js | 0 .../rinkeby/DirectPayments.address.js | 0 .../rinkeby/DirectPayments.bytecode.js | 0 .../rinkeby/FundingCycleBallot.abi.js | 0 .../rinkeby/FundingCycleBallot.address.js | 0 .../rinkeby/FundingCycleBallot.bytecode.js | 0 .../contracts/rinkeby/FundingCycles.abi.js | 0 .../rinkeby/FundingCycles.address.js | 0 .../rinkeby/FundingCycles.bytecode.js | 0 .../contracts/rinkeby/Governance.abi.js | 0 .../contracts/rinkeby/Governance.address.js | 0 .../contracts/rinkeby/Governance.bytecode.js | 0 .../rinkeby/JuiceTerminalDirectory.abi.js | 0 .../rinkeby/JuiceTerminalDirectory.address.js | 0 .../JuiceTerminalDirectory.bytecode.js | 0 .../contracts/rinkeby/Juicer.abi.js | 0 .../contracts/rinkeby/Juicer.address.js | 0 .../contracts/rinkeby/Juicer.bytecode.js | 0 .../contracts/rinkeby/ModStore.abi.js | 0 .../contracts/rinkeby/ModStore.address.js | 0 .../contracts/rinkeby/ModStore.bytecode.js | 0 .../contracts/rinkeby/OperatorStore.abi.js | 0 .../rinkeby/OperatorStore.address.js | 0 .../rinkeby/OperatorStore.bytecode.js | 0 .../contracts/rinkeby/Prices.abi.js | 0 .../contracts/rinkeby/Prices.address.js | 0 .../contracts/rinkeby/Prices.bytecode.js | 0 .../contracts/rinkeby/Projects.abi.js | 0 .../contracts/rinkeby/Projects.address.js | 0 .../contracts/rinkeby/Projects.bytecode.js | 0 .../rinkeby/ProxyPaymentAddressManager.abi.js | 0 .../ProxyPaymentAddressManager.address.js | 0 .../ProxyPaymentAddressManager.bytecode.js | 0 .../rinkeby/TerminalDirectory.abi.js | 0 .../rinkeby/TerminalDirectory.address.js | 0 .../rinkeby/TerminalDirectory.bytecode.js | 0 .../contracts/rinkeby/TerminalV1.abi.js | 0 .../contracts/rinkeby/TerminalV1.address.js | 0 .../contracts/rinkeby/TerminalV1.bytecode.js | 0 .../contracts/rinkeby/TicketBooth.abi.js | 0 .../contracts/rinkeby/TicketBooth.address.js | 0 .../contracts/rinkeby/TicketBooth.bytecode.js | 0 .../contracts/rinkeby/TicketStore.abi.js | 0 .../contracts/rinkeby/TicketStore.address.js | 0 .../contracts/rinkeby/TicketStore.bytecode.js | 0 .../contracts/rinkeby/Tickets.abi.js | 0 .../contracts/rinkeby/Tickets.address.js | 0 .../contracts/rinkeby/Tickets.bytecode.js | 0 .../contracts/rinkeby/TimelockStaker.abi.js | 0 .../rinkeby/TimelockStaker.address.js | 0 .../rinkeby/TimelockStaker.bytecode.js | 0 .../contracts/rinkeby/Token.abi.js | 0 .../contracts/rinkeby/Token.address.js | 0 .../contracts/rinkeby/Token.bytecode.js | 0 .../contracts/rinkeby/contracts.js | 0 .../contracts/ropsten/Admin.abi.js | 0 .../contracts/ropsten/Admin.address.js | 0 .../contracts/ropsten/Admin.bytecode.js | 0 .../contracts/ropsten/BudgetBallot.abi.js | 0 .../contracts/ropsten/BudgetBallot.address.js | 0 .../ropsten/BudgetBallot.bytecode.js | 0 .../contracts/ropsten/BudgetStore.abi.js | 0 .../contracts/ropsten/BudgetStore.address.js | 0 .../contracts/ropsten/BudgetStore.bytecode.js | 0 .../contracts/ropsten/Fountain.abi.js | 0 .../contracts/ropsten/Fountain.address.js | 0 .../contracts/ropsten/Fountain.bytecode.js | 0 .../contracts/ropsten/Juicer.abi.js | 0 .../contracts/ropsten/Juicer.address.js | 0 .../contracts/ropsten/Juicer.bytecode.js | 0 .../contracts/ropsten/Maintainer.abi.js | 0 .../contracts/ropsten/Maintainer.address.js | 0 .../contracts/ropsten/Maintainer.bytecode.js | 0 .../contracts/ropsten/TicketStore.abi.js | 0 .../contracts/ropsten/TicketStore.address.js | 0 .../contracts/ropsten/TicketStore.bytecode.js | 0 .../contracts/ropsten/TimelockStaker.abi.js | 0 .../ropsten/TimelockStaker.address.js | 0 .../ropsten/TimelockStaker.bytecode.js | 0 .../contracts/ropsten/Token.abi.js | 0 .../contracts/ropsten/Token.address.js | 0 .../contracts/ropsten/Token.bytecode.js | 0 .../contracts/ropsten/contracts.js | 0 {packages/app/src => src}/declarations.d.ts | 0 .../app/src => src}/hooks/AppDispatch.tsx | 0 .../app/src => src}/hooks/AppSelector.tsx | 0 .../app/src => src}/hooks/ContentType.tsx | 0 .../app/src => src}/hooks/ContractLoader.ts | 0 .../app/src => src}/hooks/ContractReader.ts | 0 .../src => src}/hooks/CurrencyConverter.ts | 0 .../src => src}/hooks/ERC20TokenBalance.tsx | 0 .../app/src => src}/hooks/Erc20Contract.ts | 0 .../app/src => src}/hooks/EthBalance.tsx | 0 {packages/app/src => src}/hooks/EtherPrice.ts | 0 .../app/src => src}/hooks/EventListener.ts | 0 {packages/app/src => src}/hooks/GasPrice.ts | 0 .../app/src => src}/hooks/HasPermission.tsx | 0 .../app/src => src}/hooks/JuiceTheme.tsx | 0 {packages/app/src => src}/hooks/Poller.ts | 0 .../app/src => src}/hooks/ProjectMetadata.tsx | 0 {packages/app/src => src}/hooks/Projects.ts | 0 {packages/app/src => src}/hooks/Transactor.ts | 0 {packages/app/src => src}/index.tsx | 0 .../app/src => src}/models/child-elems.ts | 0 .../app/src => src}/models/contract-name.ts | 0 {packages/app/src => src}/models/contracts.ts | 0 .../app/src => src}/models/currency-option.ts | 0 .../models/funding-cycle-properties.ts | 0 .../app/src => src}/models/funding-cycle.ts | 0 {packages/app/src => src}/models/label-val.ts | 0 {packages/app/src => src}/models/mods.ts | 0 .../app/src => src}/models/network-name.ts | 0 .../src => src}/models/project-metadata.ts | 0 .../app/src => src}/models/project-type.ts | 0 .../models/semantic-theme/colors.ts | 0 .../models/semantic-theme/radii.ts | 0 .../models/semantic-theme/theme.ts | 0 .../distribute-to-payout-mod-event copy.ts | 0 .../distribute-to-ticket-mod-event.ts | 0 .../models/subgraph-entities/pay-event.ts | 0 .../models/subgraph-entities/payer-report.ts | 0 .../subgraph-entities/print-reserves-event.ts | 0 .../models/subgraph-entities/project.ts | 0 .../models/subgraph-entities/redeem-event.ts | 0 .../models/subgraph-entities/tap-event.ts | 0 {packages/app/src => src}/models/token-ref.ts | 0 .../app/src => src}/models/tx-gas-option.ts | 0 {packages/app/src => src}/react-app-env.d.ts | 0 .../redux/slices/editingProject.ts | 0 {packages/app/src => src}/redux/store.ts | 0 {packages/app/src => src}/reportWebVitals.ts | 0 {packages/app/src => src}/setupTests.ts | 0 .../styles/antd-overrides/button.scss | 0 .../styles/antd-overrides/collapse.scss | 0 .../styles/antd-overrides/description.scss | 0 .../styles/antd-overrides/drawer.scss | 0 .../styles/antd-overrides/index.scss | 0 .../styles/antd-overrides/input.scss | 0 .../styles/antd-overrides/layout.scss | 0 .../styles/antd-overrides/menu-item.scss | 0 .../styles/antd-overrides/modal.scss | 0 .../styles/antd-overrides/notification.scss | 0 .../styles/antd-overrides/picker.scss | 0 .../styles/antd-overrides/progress.scss | 0 .../styles/antd-overrides/slider.scss | 0 .../styles/antd-overrides/space.scss | 0 .../styles/antd-overrides/spin.scss | 0 .../styles/antd-overrides/statistic.scss | 0 .../styles/antd-overrides/step.scss | 0 .../styles/antd-overrides/switch.scss | 0 .../styles/antd-overrides/tab.scss | 0 .../styles/antd-overrides/timeline.scss | 0 .../styles/antd-overrides/tooltip.scss | 0 {packages/app/src => src}/styles/antd.css | 0 {packages/app/src => src}/styles/antd.less | 0 .../styles/blocknative-overrides.scss | 0 {packages/app/src => src}/styles/index.scss | 0 .../app/src => src}/utils/bigNumbersDiff.ts | 0 {packages/app/src => src}/utils/currency.ts | 0 .../src => src}/utils/deepEqFundingCycles.ts | 0 .../app/src => src}/utils/formatCurrency.ts | 0 {packages/app/src => src}/utils/formatDate.ts | 0 .../app/src => src}/utils/formatHandle.ts | 0 .../app/src => src}/utils/formatNumber.ts | 0 {packages/app/src => src}/utils/formatTime.ts | 0 .../app/src => src}/utils/fundingCycle.ts | 0 {packages/app/src => src}/utils/graph.ts | 0 {packages/app/src => src}/utils/ipfs.ts | 0 {packages/app/src => src}/utils/math.ts | 0 {packages/app/src => src}/utils/onboard.ts | 0 {packages/app/src => src}/utils/orEmpty.ts | 0 .../app/src => src}/utils/serializers.ts | 0 packages/app/tsconfig.json => tsconfig.json | 0 yarn.lock | 23235 ---------------- 633 files changed, 83 insertions(+), 65125 deletions(-) rename packages/app/.example.env => .example.env (76%) delete mode 100644 .github/workflows/presubmit.yml rename packages/app/.prettierrc => .prettierrc (100%) rename packages/app/app.template.yaml => app.template.yaml (100%) rename packages/app/app.yaml => app.yaml (100%) delete mode 100644 gas.txt delete mode 100644 packages/app/README.md delete mode 100644 packages/app/package.json delete mode 100644 packages/hardhat/.eslintrc.js delete mode 100644 packages/hardhat/.example.env delete mode 100644 packages/hardhat/constants/dai.js delete mode 100644 packages/hardhat/constants/eth_usd_price_feed.js delete mode 100644 packages/hardhat/constants/skip-publish.js delete mode 100644 packages/hardhat/constants/weth.js delete mode 100644 packages/hardhat/contracts/Active14DaysFundingCycleBallot.sol delete mode 100644 packages/hardhat/contracts/Active3DaysFundingCycleBallot.sol delete mode 100644 packages/hardhat/contracts/Active7DaysFundingCycleBallot.sol delete mode 100644 packages/hardhat/contracts/DirectPaymentAddress.sol delete mode 100644 packages/hardhat/contracts/ExampleETHUSDPriceFeed.sol delete mode 100644 packages/hardhat/contracts/ExampleFailingFundingCycleBallot.sol delete mode 100644 packages/hardhat/contracts/ExampleJuiceboxProject.sol delete mode 100644 packages/hardhat/contracts/ExampleModAllocator.sol delete mode 100644 packages/hardhat/contracts/ExampleYielder.sol delete mode 100644 packages/hardhat/contracts/FundingCycles.sol delete mode 100644 packages/hardhat/contracts/Governance.sol delete mode 100644 packages/hardhat/contracts/ModStore.sol delete mode 100644 packages/hardhat/contracts/OperatorStore.sol delete mode 100644 packages/hardhat/contracts/Prices.sol delete mode 100644 packages/hardhat/contracts/Projects.sol delete mode 100644 packages/hardhat/contracts/ProxyPaymentAddress.sol delete mode 100644 packages/hardhat/contracts/ProxyPaymentAddressManager.sol delete mode 100644 packages/hardhat/contracts/TerminalDirectory.sol delete mode 100644 packages/hardhat/contracts/TerminalV1.sol delete mode 100644 packages/hardhat/contracts/TicketBooth.sol delete mode 100644 packages/hardhat/contracts/Tickets.sol delete mode 100644 packages/hardhat/contracts/TokenRepresentationProxy.sol delete mode 100644 packages/hardhat/contracts/YearnYielder.sol delete mode 100644 packages/hardhat/contracts/abstract/JuiceboxProject.sol delete mode 100644 packages/hardhat/contracts/abstract/Operatable.sol delete mode 100644 packages/hardhat/contracts/abstract/TerminalUtility.sol delete mode 100644 packages/hardhat/contracts/examples/Shwotime.sol delete mode 100644 packages/hardhat/contracts/examples/YourContract.sol delete mode 100644 packages/hardhat/contracts/interfaces/IDirectPaymentAddress.sol delete mode 100644 packages/hardhat/contracts/interfaces/IFundingCycleBallot.sol delete mode 100644 packages/hardhat/contracts/interfaces/IFundingCycles.sol delete mode 100644 packages/hardhat/contracts/interfaces/IModAllocator.sol delete mode 100644 packages/hardhat/contracts/interfaces/IModStore.sol delete mode 100644 packages/hardhat/contracts/interfaces/IOperatable.sol delete mode 100644 packages/hardhat/contracts/interfaces/IOperatorStore.sol delete mode 100644 packages/hardhat/contracts/interfaces/IPrices.sol delete mode 100644 packages/hardhat/contracts/interfaces/IProjects.sol delete mode 100644 packages/hardhat/contracts/interfaces/IProxyPaymentAddress.sol delete mode 100644 packages/hardhat/contracts/interfaces/IProxyPaymentAddressManager.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITerminal.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITerminalDirectory.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITerminalUtility.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITerminalV1.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITicketBooth.sol delete mode 100644 packages/hardhat/contracts/interfaces/ITickets.sol delete mode 100644 packages/hardhat/contracts/interfaces/IWETH.sol delete mode 100644 packages/hardhat/contracts/interfaces/IYielder.sol delete mode 100644 packages/hardhat/contracts/interfaces/IyVaultV2.sol delete mode 100644 packages/hardhat/contracts/libraries/Operations.sol delete mode 100644 packages/hardhat/hardhat.config.js delete mode 100644 packages/hardhat/package.json delete mode 100644 packages/hardhat/scripts/deployAll.js delete mode 100644 packages/hardhat/scripts/deployProxyPaymentAddressManager.js delete mode 100644 packages/hardhat/scripts/publish.js delete mode 100644 packages/hardhat/scripts/utils.js delete mode 100644 packages/hardhat/scripts/watch.js delete mode 100644 packages/hardhat/tasks/deploy.js delete mode 100644 packages/hardhat/test/index.js delete mode 100644 packages/hardhat/test/integration/index.js delete mode 100644 packages/hardhat/test/integration/workflows/approved_ballot.js delete mode 100644 packages/hardhat/test/integration/workflows/challenge_handle.js delete mode 100644 packages/hardhat/test/integration/workflows/currency_conversion.js delete mode 100644 packages/hardhat/test/integration/workflows/deploy.js delete mode 100644 packages/hardhat/test/integration/workflows/direct_payment_addresses.js delete mode 100644 packages/hardhat/test/integration/workflows/failed_ballot.js delete mode 100644 packages/hardhat/test/integration/workflows/governance.js delete mode 100644 packages/hardhat/test/integration/workflows/index.js delete mode 100644 packages/hardhat/test/integration/workflows/issue_tickets.js delete mode 100644 packages/hardhat/test/integration/workflows/iterated_failed_ballot.js delete mode 100644 packages/hardhat/test/integration/workflows/limit.js delete mode 100644 packages/hardhat/test/integration/workflows/migrate.js delete mode 100644 packages/hardhat/test/integration/workflows/non_recurring.js delete mode 100644 packages/hardhat/test/integration/workflows/operator_permissions.js delete mode 100644 packages/hardhat/test/integration/workflows/print_premined_tickets.js delete mode 100644 packages/hardhat/test/integration/workflows/print_reserved_tickets.js delete mode 100644 packages/hardhat/test/integration/workflows/projects.js delete mode 100644 packages/hardhat/test/integration/workflows/proxy_payment_addresses.js delete mode 100644 packages/hardhat/test/integration/workflows/reconfigure.js delete mode 100644 packages/hardhat/test/integration/workflows/redeem.js delete mode 100644 packages/hardhat/test/integration/workflows/set_fee.js delete mode 100644 packages/hardhat/test/integration/workflows/set_payout_mods.js delete mode 100644 packages/hardhat/test/integration/workflows/set_terminal.js delete mode 100644 packages/hardhat/test/integration/workflows/set_ticket_mods.js delete mode 100644 packages/hardhat/test/integration/workflows/take_fee.js delete mode 100644 packages/hardhat/test/integration/workflows/tap.js delete mode 100644 packages/hardhat/test/integration/workflows/ticket_locking_and transfers.js delete mode 100644 packages/hardhat/test/integration/workflows/transfer_project_ownership.js delete mode 100644 packages/hardhat/test/integration/workflows/zero_duration.js delete mode 100644 packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/receive.js delete mode 100644 packages/hardhat/test/unit/behaviors/direct_payment_address/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/configure.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_ballot_state_of.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_of.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/queued_of.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/tap.js delete mode 100644 packages/hardhat/test/unit/behaviors/funding_cycles/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/behaviors/add_price_feed.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/behaviors/allow_migration.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/behaviors/appoint_governance.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/behaviors/set_fee.js delete mode 100644 packages/hardhat/test/unit/behaviors/governance/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/pay.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operator.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operators.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_project_id.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/take_fee.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/transfer_project_ownership.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/behaviors/withdraw.js delete mode 100644 packages/hardhat/test/unit/behaviors/juice_project/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/mod_store/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_payment_mods.js delete mode 100644 packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_ticket_mods.js delete mode 100644 packages/hardhat/test/unit/behaviors/mod_store/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permission.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permissions.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operator.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operators.js delete mode 100644 packages/hardhat/test/unit/behaviors/operator_store/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/prices/behaviors/add_feed.js delete mode 100644 packages/hardhat/test/unit/behaviors/prices/behaviors/get_eth_price_for.js delete mode 100644 packages/hardhat/test/unit/behaviors/prices/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/prices/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/challenge_handle.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/claim_handle.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/create.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/renew_handle.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/set_handle.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/set_uri.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/behaviors/transfer_handle.js delete mode 100644 packages/hardhat/test/unit/behaviors/projects/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/tap.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/transfer_tickets.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/deploy_proxy_payment_address.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/deploy_address.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_payer_preferences.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_terminal.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_directory/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/accept_governance.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/add_to_balance.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/allow_migration.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/appoint_governance.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/configure.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/deploy.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/migrate.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/pay.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_premined_tickets.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_reserved_tickets.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/redeem.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/set_fee.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/tap.js delete mode 100644 packages/hardhat/test/unit/behaviors/terminal_v1/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/balance_of.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/index.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/issue.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/lock.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/print.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/redeem.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/stake.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/total_supply_of.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/transfer.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unlock.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unstake.js delete mode 100644 packages/hardhat/test/unit/behaviors/ticket_booth/index.js delete mode 100644 packages/hardhat/test/unit/index.js rename {packages/app/public => public}/assets/arrow.png (100%) rename {packages/app/public => public}/assets/banana-cover.png (100%) rename {packages/app/public => public}/assets/banana-od.png (100%) rename {packages/app/public => public}/assets/banana-ol.png (100%) rename {packages/app/public => public}/assets/banana_dwgj.png (100%) rename {packages/app/public => public}/assets/blueberry-ol.png (100%) rename {packages/app/public => public}/assets/bolt.png (100%) rename {packages/app/public => public}/assets/cooler_if_you_did.png (100%) rename {packages/app/public => public}/assets/fountain_of_juice.png (100%) rename {packages/app/public => public}/assets/glass_overflow.png (100%) rename {packages/app/public => public}/assets/juice_logo-od.png (100%) rename {packages/app/public => public}/assets/juice_logo-ol.png (100%) rename {packages/app/public => public}/assets/orange_lady-od.png (100%) rename {packages/app/public => public}/assets/orange_lady-ol.png (100%) rename {packages/app/public => public}/assets/pina.png (100%) rename {packages/app/public => public}/favicon.ico (100%) rename {packages/app/public => public}/index.html (100%) rename {packages/app/public => public}/info/1.txt (100%) rename {packages/app/public => public}/manifest.json (100%) rename {packages/app/public => public}/robots.txt (100%) rename {packages/app/src => src}/Network.tsx (100%) rename {packages/app/src => src}/Theme.tsx (100%) rename {packages/app/src => src}/User.tsx (100%) rename {packages/app/src => src}/components/App.test.tsx (100%) rename {packages/app/src => src}/components/App.tsx (100%) rename {packages/app/src => src}/components/CatchallRedirect.tsx (100%) rename {packages/app/src => src}/components/Create/BudgetForm.tsx (100%) rename {packages/app/src => src}/components/Create/ConfirmDeployProject.tsx (100%) rename {packages/app/src => src}/components/Create/IncentivesForm.tsx (100%) rename {packages/app/src => src}/components/Create/PayModsForm.tsx (100%) rename {packages/app/src => src}/components/Create/ProjectForm.tsx (100%) rename {packages/app/src => src}/components/Create/RulesForm.tsx (100%) rename {packages/app/src => src}/components/Create/TicketingForm.tsx (100%) rename {packages/app/src => src}/components/Create/index.tsx (100%) rename {packages/app/src => src}/components/Dashboard/BalanceTimeline.tsx (100%) rename {packages/app/src => src}/components/Dashboard/FundingCycles.tsx (100%) rename {packages/app/src => src}/components/Dashboard/FundingHistory.tsx (100%) rename {packages/app/src => src}/components/Dashboard/IssueTickets.tsx (100%) rename {packages/app/src => src}/components/Dashboard/Paid.tsx (100%) rename {packages/app/src => src}/components/Dashboard/Pay.tsx (100%) rename {packages/app/src => src}/components/Dashboard/PrintPremined.tsx (100%) rename {packages/app/src => src}/components/Dashboard/Project.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/PayerReports.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/PaymentActivity.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/RedeemActivity.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/ReservesActivity.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/ReservesEventElem.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/RichNote.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/TapActivity.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/TapEventElem.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/index.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ProjectActivity/styles.ts (100%) rename {packages/app/src => src}/components/Dashboard/ProjectHeader.tsx (100%) rename {packages/app/src => src}/components/Dashboard/ReservedTokens.tsx (100%) rename {packages/app/src => src}/components/Dashboard/Rewards.tsx (100%) rename {packages/app/src => src}/components/Dashboard/SectionHeader.tsx (100%) rename {packages/app/src => src}/components/Dashboard/Spending.tsx (100%) rename {packages/app/src => src}/components/Dashboard/index.tsx (100%) rename {packages/app/src => src}/components/Dashboard/styles.ts (100%) rename {packages/app/src => src}/components/FundingCycle/CurrentFundingCycle.tsx (100%) rename {packages/app/src => src}/components/FundingCycle/FundingCycleDetails.tsx (100%) rename {packages/app/src => src}/components/FundingCycle/FundingCyclePreview.tsx (100%) rename {packages/app/src => src}/components/FundingCycle/QueuedFundingCycle.tsx (100%) rename {packages/app/src => src}/components/Gimme.tsx (100%) rename {packages/app/src => src}/components/Landing/DefineProject.tsx (100%) rename {packages/app/src => src}/components/Landing/Faq.tsx (100%) rename {packages/app/src => src}/components/Landing/Footer.tsx (100%) rename {packages/app/src => src}/components/Landing/index.tsx (100%) rename {packages/app/src => src}/components/Navbar/Account.tsx (100%) rename {packages/app/src => src}/components/Navbar/Balance.tsx (100%) rename {packages/app/src => src}/components/Navbar/EthPrice.tsx (100%) rename {packages/app/src => src}/components/Navbar/ThemePicker.tsx (100%) rename {packages/app/src => src}/components/Navbar/Wallet.tsx (100%) rename {packages/app/src => src}/components/Navbar/index.tsx (100%) rename {packages/app/src => src}/components/Projects/index.tsx (100%) rename {packages/app/src => src}/components/Router.tsx (100%) rename {packages/app/src => src}/components/icons/Moon.tsx (100%) rename {packages/app/src => src}/components/icons/Sun.tsx (100%) rename {packages/app/src => src}/components/modals/BalancesModal.tsx (100%) rename {packages/app/src => src}/components/modals/ConfirmPayOwnerModal.tsx (100%) rename {packages/app/src => src}/components/modals/ConfirmStakeTokensModal.tsx (100%) rename {packages/app/src => src}/components/modals/ConfirmUnstakeTokensModal.tsx (100%) rename {packages/app/src => src}/components/modals/DistributeTokensModal.tsx (100%) rename {packages/app/src => src}/components/modals/EditProjectModal.tsx (100%) rename {packages/app/src => src}/components/modals/ProjectToolDrawerModal.tsx (100%) rename {packages/app/src => src}/components/modals/ReconfigureFCModal.tsx (100%) rename {packages/app/src => src}/components/modals/WithdrawModal.tsx (100%) rename {packages/app/src => src}/components/shared/CardSection.tsx (100%) rename {packages/app/src => src}/components/shared/CurrencySymbol.tsx (100%) rename {packages/app/src => src}/components/shared/ERC20TokenBalance.tsx (100%) rename {packages/app/src => src}/components/shared/FCNumber.tsx (100%) rename {packages/app/src => src}/components/shared/FormattedAddress.tsx (100%) rename {packages/app/src => src}/components/shared/InputAccessoryButton.tsx (100%) rename {packages/app/src => src}/components/shared/Loading.tsx (100%) rename {packages/app/src => src}/components/shared/Mod.tsx (100%) rename {packages/app/src => src}/components/shared/PayoutModsList.tsx (100%) rename {packages/app/src => src}/components/shared/ProjectCard.tsx (100%) rename {packages/app/src => src}/components/shared/ProjectHandle.tsx (100%) rename {packages/app/src => src}/components/shared/ProjectLogo.tsx (100%) rename {packages/app/src => src}/components/shared/ProjectTokenBalance.tsx (100%) rename {packages/app/src => src}/components/shared/ProjectsGrid.tsx (100%) rename {packages/app/src => src}/components/shared/RichImgPreview.tsx (100%) rename {packages/app/src => src}/components/shared/TicketModsList.tsx (100%) rename {packages/app/src => src}/components/shared/TooltipIcon.tsx (100%) rename {packages/app/src => src}/components/shared/TooltipLabel.tsx (100%) rename {packages/app/src => src}/components/shared/WtfCard.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/EthAddress.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectBondingCurveRate.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectDescription.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectDiscountRate.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectDuration.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectHandle.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectLink.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectLogoUrl.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectName.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectPayoutMods.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectReserved.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectTarget.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/ProjectTicketMods.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/TokenRefs.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/formItemExt.tsx (100%) rename {packages/app/src => src}/components/shared/formItems/index.tsx (100%) rename {packages/app/src => src}/components/shared/inputs/BudgetTargetInput.tsx (100%) rename {packages/app/src => src}/components/shared/inputs/FormattedNumberInput.tsx (100%) rename {packages/app/src => src}/components/shared/inputs/ImageUploader.tsx (100%) rename {packages/app/src => src}/components/shared/inputs/NumberSlider.tsx (100%) rename {packages/app/src => src}/constants/ballot-strategies.ts (100%) rename {packages/app/src => src}/constants/networks.ts (100%) rename {packages/app/src => src}/constants/project-types.ts (100%) rename {packages/app/src => src}/constants/readProvider.ts (100%) rename {packages/app/src => src}/constants/styles/colors.ts (100%) rename {packages/app/src => src}/constants/styles/layouts.ts (100%) rename {packages/app/src => src}/constants/styles/padding.ts (100%) rename {packages/app/src => src}/constants/styles/shadowCard.ts (100%) rename {packages/app/src => src}/constants/subgraphs.ts (100%) rename {packages/app/src => src}/constants/theme/colors/background.ts (100%) rename {packages/app/src => src}/constants/theme/colors/icon.ts (100%) rename {packages/app/src => src}/constants/theme/colors/index.ts (100%) rename {packages/app/src => src}/constants/theme/colors/stroke.ts (100%) rename {packages/app/src => src}/constants/theme/colors/text.ts (100%) rename {packages/app/src => src}/constants/theme/index.ts (100%) rename {packages/app/src => src}/constants/theme/radius/index.ts (100%) rename {packages/app/src => src}/constants/theme/theme-option.ts (100%) rename {packages/app/src => src}/constants/tokens/dai.ts (100%) rename {packages/app/src => src}/contexts/networkContext.ts (100%) rename {packages/app/src => src}/contexts/projectContext.ts (100%) rename {packages/app/src => src}/contexts/themeContext.ts (100%) rename {packages/app/src => src}/contexts/userContext.ts (100%) rename {packages/app/src => src}/contracts/kovan/Active14DaysFundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Active14DaysFundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Active14DaysFundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Active7DaysFundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Active7DaysFundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Active7DaysFundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Admin.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Admin.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Admin.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetBallot.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetBallot.address.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetStore.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetStore.address.js (100%) rename {packages/app/src => src}/contracts/kovan/BudgetStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/DirectPayments.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/DirectPayments.address.js (100%) rename {packages/app/src => src}/contracts/kovan/DirectPayments.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycles.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycles.address.js (100%) rename {packages/app/src => src}/contracts/kovan/FundingCycles.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Governance.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Governance.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Governance.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/JuiceTerminalDirectory.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/JuiceTerminalDirectory.address.js (100%) rename {packages/app/src => src}/contracts/kovan/JuiceTerminalDirectory.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Juicer.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Juicer.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Juicer.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/ModStore.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/ModStore.address.js (100%) rename {packages/app/src => src}/contracts/kovan/ModStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/OperatorStore.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/OperatorStore.address.js (100%) rename {packages/app/src => src}/contracts/kovan/OperatorStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Prices.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Prices.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Prices.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Projects.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Projects.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Projects.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalDirectory.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalDirectory.address.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalDirectory.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalV1.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalV1.address.js (100%) rename {packages/app/src => src}/contracts/kovan/TerminalV1.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketBooth.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketBooth.address.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketBooth.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketStore.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketStore.address.js (100%) rename {packages/app/src => src}/contracts/kovan/TicketStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Tickets.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Tickets.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Tickets.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/TimelockStaker.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/TimelockStaker.address.js (100%) rename {packages/app/src => src}/contracts/kovan/TimelockStaker.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/Token.abi.js (100%) rename {packages/app/src => src}/contracts/kovan/Token.address.js (100%) rename {packages/app/src => src}/contracts/kovan/Token.bytecode.js (100%) rename {packages/app/src => src}/contracts/kovan/contracts.js (100%) rename {packages/app/src => src}/contracts/mainnet/Active7DaysFundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/Active7DaysFundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/Active7DaysFundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/FundingCycles.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/FundingCycles.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/FundingCycles.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/Governance.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/Governance.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/Governance.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/ModStore.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/ModStore.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/ModStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/OperatorStore.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/OperatorStore.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/OperatorStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/Prices.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/Prices.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/Prices.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/Projects.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/Projects.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/Projects.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/ProxyPaymentAddressManager.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/ProxyPaymentAddressManager.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/ProxyPaymentAddressManager.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalDirectory.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalDirectory.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalDirectory.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalV1.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalV1.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/TerminalV1.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/TicketBooth.abi.js (100%) rename {packages/app/src => src}/contracts/mainnet/TicketBooth.address.js (100%) rename {packages/app/src => src}/contracts/mainnet/TicketBooth.bytecode.js (100%) rename {packages/app/src => src}/contracts/mainnet/contracts.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active14DaysFundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active14DaysFundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active14DaysFundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active7DaysFundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active7DaysFundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Active7DaysFundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Admin.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Admin.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Admin.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetBallot.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetBallot.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetStore.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetStore.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/BudgetStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/DirectPayments.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/DirectPayments.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/DirectPayments.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycleBallot.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycleBallot.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycleBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycles.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycles.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/FundingCycles.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Governance.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Governance.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Governance.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/JuiceTerminalDirectory.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/JuiceTerminalDirectory.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/JuiceTerminalDirectory.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Juicer.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Juicer.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Juicer.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ModStore.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ModStore.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ModStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/OperatorStore.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/OperatorStore.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/OperatorStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Prices.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Prices.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Prices.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Projects.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Projects.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Projects.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ProxyPaymentAddressManager.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ProxyPaymentAddressManager.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/ProxyPaymentAddressManager.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalDirectory.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalDirectory.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalDirectory.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalV1.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalV1.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TerminalV1.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketBooth.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketBooth.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketBooth.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketStore.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketStore.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TicketStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Tickets.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Tickets.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Tickets.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TimelockStaker.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TimelockStaker.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/TimelockStaker.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Token.abi.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Token.address.js (100%) rename {packages/app/src => src}/contracts/rinkeby/Token.bytecode.js (100%) rename {packages/app/src => src}/contracts/rinkeby/contracts.js (100%) rename {packages/app/src => src}/contracts/ropsten/Admin.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/Admin.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/Admin.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetBallot.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetBallot.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetBallot.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetStore.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetStore.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/BudgetStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/Fountain.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/Fountain.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/Fountain.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/Juicer.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/Juicer.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/Juicer.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/Maintainer.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/Maintainer.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/Maintainer.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/TicketStore.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/TicketStore.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/TicketStore.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/TimelockStaker.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/TimelockStaker.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/TimelockStaker.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/Token.abi.js (100%) rename {packages/app/src => src}/contracts/ropsten/Token.address.js (100%) rename {packages/app/src => src}/contracts/ropsten/Token.bytecode.js (100%) rename {packages/app/src => src}/contracts/ropsten/contracts.js (100%) rename {packages/app/src => src}/declarations.d.ts (100%) rename {packages/app/src => src}/hooks/AppDispatch.tsx (100%) rename {packages/app/src => src}/hooks/AppSelector.tsx (100%) rename {packages/app/src => src}/hooks/ContentType.tsx (100%) rename {packages/app/src => src}/hooks/ContractLoader.ts (100%) rename {packages/app/src => src}/hooks/ContractReader.ts (100%) rename {packages/app/src => src}/hooks/CurrencyConverter.ts (100%) rename {packages/app/src => src}/hooks/ERC20TokenBalance.tsx (100%) rename {packages/app/src => src}/hooks/Erc20Contract.ts (100%) rename {packages/app/src => src}/hooks/EthBalance.tsx (100%) rename {packages/app/src => src}/hooks/EtherPrice.ts (100%) rename {packages/app/src => src}/hooks/EventListener.ts (100%) rename {packages/app/src => src}/hooks/GasPrice.ts (100%) rename {packages/app/src => src}/hooks/HasPermission.tsx (100%) rename {packages/app/src => src}/hooks/JuiceTheme.tsx (100%) rename {packages/app/src => src}/hooks/Poller.ts (100%) rename {packages/app/src => src}/hooks/ProjectMetadata.tsx (100%) rename {packages/app/src => src}/hooks/Projects.ts (100%) rename {packages/app/src => src}/hooks/Transactor.ts (100%) rename {packages/app/src => src}/index.tsx (100%) rename {packages/app/src => src}/models/child-elems.ts (100%) rename {packages/app/src => src}/models/contract-name.ts (100%) rename {packages/app/src => src}/models/contracts.ts (100%) rename {packages/app/src => src}/models/currency-option.ts (100%) rename {packages/app/src => src}/models/funding-cycle-properties.ts (100%) rename {packages/app/src => src}/models/funding-cycle.ts (100%) rename {packages/app/src => src}/models/label-val.ts (100%) rename {packages/app/src => src}/models/mods.ts (100%) rename {packages/app/src => src}/models/network-name.ts (100%) rename {packages/app/src => src}/models/project-metadata.ts (100%) rename {packages/app/src => src}/models/project-type.ts (100%) rename {packages/app/src => src}/models/semantic-theme/colors.ts (100%) rename {packages/app/src => src}/models/semantic-theme/radii.ts (100%) rename {packages/app/src => src}/models/semantic-theme/theme.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/distribute-to-payout-mod-event copy.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/distribute-to-ticket-mod-event.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/pay-event.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/payer-report.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/print-reserves-event.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/project.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/redeem-event.ts (100%) rename {packages/app/src => src}/models/subgraph-entities/tap-event.ts (100%) rename {packages/app/src => src}/models/token-ref.ts (100%) rename {packages/app/src => src}/models/tx-gas-option.ts (100%) rename {packages/app/src => src}/react-app-env.d.ts (100%) rename {packages/app/src => src}/redux/slices/editingProject.ts (100%) rename {packages/app/src => src}/redux/store.ts (100%) rename {packages/app/src => src}/reportWebVitals.ts (100%) rename {packages/app/src => src}/setupTests.ts (100%) rename {packages/app/src => src}/styles/antd-overrides/button.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/collapse.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/description.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/drawer.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/index.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/input.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/layout.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/menu-item.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/modal.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/notification.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/picker.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/progress.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/slider.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/space.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/spin.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/statistic.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/step.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/switch.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/tab.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/timeline.scss (100%) rename {packages/app/src => src}/styles/antd-overrides/tooltip.scss (100%) rename {packages/app/src => src}/styles/antd.css (100%) rename {packages/app/src => src}/styles/antd.less (100%) rename {packages/app/src => src}/styles/blocknative-overrides.scss (100%) rename {packages/app/src => src}/styles/index.scss (100%) rename {packages/app/src => src}/utils/bigNumbersDiff.ts (100%) rename {packages/app/src => src}/utils/currency.ts (100%) rename {packages/app/src => src}/utils/deepEqFundingCycles.ts (100%) rename {packages/app/src => src}/utils/formatCurrency.ts (100%) rename {packages/app/src => src}/utils/formatDate.ts (100%) rename {packages/app/src => src}/utils/formatHandle.ts (100%) rename {packages/app/src => src}/utils/formatNumber.ts (100%) rename {packages/app/src => src}/utils/formatTime.ts (100%) rename {packages/app/src => src}/utils/fundingCycle.ts (100%) rename {packages/app/src => src}/utils/graph.ts (100%) rename {packages/app/src => src}/utils/ipfs.ts (100%) rename {packages/app/src => src}/utils/math.ts (100%) rename {packages/app/src => src}/utils/onboard.ts (100%) rename {packages/app/src => src}/utils/orEmpty.ts (100%) rename {packages/app/src => src}/utils/serializers.ts (100%) rename packages/app/tsconfig.json => tsconfig.json (100%) delete mode 100644 yarn.lock diff --git a/packages/app/.example.env b/.example.env similarity index 76% rename from packages/app/.example.env rename to .example.env index ad1f344e74..4750ff794b 100644 --- a/packages/app/.example.env +++ b/.example.env @@ -1,5 +1,5 @@ REACT_APP_INFURA_ID= -REACT_APP_INFURA_NETWORK=localhost +REACT_APP_INFURA_NETWORK=rinkeby REACT_APP_PINATA_PINNER_KEY= REACT_APP_PINATA_PINNER_SECRET= REACT_APP_BLOCKNATIVE_API_KEY= \ No newline at end of file diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml deleted file mode 100644 index 011100beb3..0000000000 --- a/.github/workflows/presubmit.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: 🍹 Contract Tests -on: - push: - branches: - - main - pull_request: - branches: - - main -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Read .nvmrc - run: echo ::set-output name=NVMRC::$(cat .nvmrc) - id: nvm - - name: Use Node.js ${{ steps.nvm.outputs.NVMRC }} - uses: actions/setup-node@v1 - with: - node-version: "${{ steps.nvm.outputs.NVMRC }}" - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore cached yarn cache - uses: actions/cache@v2 - id: cache-yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Restore cached node_modules - id: cache-node-modules - uses: actions/cache@v2 - with: - path: | - ./node_modules - ./packages/hardhat/node_modules - key: ${{ runner.os }}-${{ steps.nvm.outputs.NVMRC }}-nodemodules-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-${{ steps.nvm.outputs.NVMRC }}-nodemodules- - - name: Install JS dependencies - if: | - steps.cache-yarn-cache.outputs.cache-hit != 'true' || - steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn install --frozen-lockfile --prefer-offline - # Bring up local chain in a separate process. - # TODO: There may be a better way to do this (e.g., run everything with Docker Compose). - - name: Chain - run: yarn chain &>/dev/null & - - name: Test - run: yarn test diff --git a/.gitignore b/.gitignore index 059009a4a8..f575a1055b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -packages/subgraph/generated packages/hardhat/*.txt **/aws.json @@ -14,8 +13,6 @@ packages/hardhat/cache docker/**/data -packages/subgraph/config/localhost.json - # dependencies /node_modules /.pnp diff --git a/packages/app/.prettierrc b/.prettierrc similarity index 100% rename from packages/app/.prettierrc rename to .prettierrc diff --git a/.vscode/settings.json b/.vscode/settings.json index 422929dd95..7ba84c798e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,3 @@ { "editor.tabSize": 2, - "solidity.compileUsingRemoteVersion": "0.8.6", - "solidity.linter": "solhint", - "solidity.solhintRules": { - "avoid-sha3": "error", - "no-inline-assembly": "warn" - }, - "solidity.compilerOptimization": 10000 } \ No newline at end of file diff --git a/README.md b/README.md index 0f2285c6d4..07ccf81fb3 100644 --- a/README.md +++ b/README.md @@ -1,140 +1,51 @@ -# 🧃 juicebox.money +# juice-juicehoue -[juicebox.money](https://juicebox.money) +Juicebox frontend application. -Built with [🏗 scaffold-eth](https://github.com/austintgriffith/scaffold-eth) +- Mainnet: https://juicebox.money +- Rinkeby: https://rinkeby.juicebox.money -For a visual overview of how the mechanism works, see the [Fluid Dynamics file on Figma](https://www.figma.com/file/dHsQ7Bt3ryXbZ2sRBAfBq5/Fluid-Dynamics?node-id=0%3A1) +## Usage ---- +1. `Create `.env` from `.example.env`. -## Run local + ```bash + yarn install + yarn start + ``` -Serve the app locally and use with a local blockchain. +1. Clone the respository: -In `packages/app`, Create `.env` from `.example.env`, add required `REACT_APP_INFURA_ID`. + ```bash + git clone https://github.com/jbx-protocol/juice-juicehouse.git + cd juice-juicehouse + ``` -```bash -yarn install -``` +1. Create an `.env` file in the root directory which mirrors the `.sample.env` file. -> start 👷[Hardhat](https://hardhat.org/) local blockchain: +1. Install dependencies and start the app: -```bash -yarn chain -``` + ``` + yarn install + yarn start + ``` -> in a second terminal window, deploy contract to local blockchain: - -```bash -yarn deploy-local -``` - -> in a third terminal window, start the app and open http://localhost:3000 to view it - -```bash -yarn start -``` - -🔑 Create wallets links to your app with `yarn wallet` (empty) or `yarn fundedwallet --amount ` (pre-loaded with ETH) and navigate to generated url (http://localhost:3000/pk#\) - -Note: `yarn fundedwallet` will fail if your local deployer account has a 0 balance. To fund it, first: - -- Get account address on local chain using `yarn account` -- Run `yarn send --from 1 --to --amount 10` to send 10 ETH to deployer account from first auto-generated hardhat account wallet - -🔧 Configure 👷[HardHat](https://hardhat.org/config/) by editing `hardhat.config.js` in `packages/hardhat` - -> ✨ The [HardHat network](https://hardhat.org/hardhat-network/) provides _stack traces_ and _console.log_ debugging for our contracts ✨ - -Run `yarn account` to create a local deployer wallet private key. To send ETH to generated wallet on a local chain, run `# yarn send --from
--to --amount ` - ---- - -## Deploying contracts - -Contracts are located in `packages/hardhat/contracts`. - -Each time contracts are deployed, artifacts are copied to: - -- `packages/app/src/contracts` where they're used by the frontend - -The frontend connects to whichever chain its provider (i.e. Metamask) is using to, and reads the corresponding contract artifacts for that chain. Connecting to a chain that juicebox contracts have not been deployed to will cause the app to fail. - -### deploy to local chain - -```bash -yarn deploy-local -``` - -### deploy public chain ropsten - -```bash -yarn deploy-rinkeby -``` - -```bash -yarn deploy-kovan -``` - -```bash -yarn deploy-mainnet -``` - -## Frontend .env - -Create new `packages/app/.env`, reference `packages/app/.example.env`. - ---- - -## 🔏 Web3 Providers: +## Web3 Providers: The frontend has two different providers that provide different levels of access to different chains: -`readProvider`: used to read from contracts on network of injected provider (`.env` file points you at testnet or mainnet) - -`signingProvider`: your personal wallet, connected to via [Blocknative](https://docs.blocknative.com/onboard). +- `readProvider`: used to read from contracts on network of injected provider (`.env` file points you at testnet or mainnet) +- `signingProvider`: your personal wallet, connected to via [Blocknative](https://docs.blocknative.com/onboard). ---- -## Deploying frontend +## Deployment Frontend deployment is managed automatically through [Fleek](https://app.fleek.co/#/sites/juicebox-kovan). -[kovan.juicebox.money](kovan.juicebox.money) and [rinkeby.juicebox.money](rinkeby.juicebox.money) deploy automatically from `main`. - -Automatic deployment does not: - -- deploy contracts +[rinkeby.juicebox.money](rinkeby.juicebox.money) deploys automatically from `main`. ## Theme The app uses the `SemanticTheme` pattern defined in src/models/semantic-theme, which allows mapping style properties to any number of enumerated `ThemeOption`s. These properties are defined in src/constants/theme. Theme styles can be accessed via `ThemeContext` defined in src/contexts/themeContext and instantiated in src/hooks/JuiceTheme, or via CSS root variables. The app also relies on (antd)[https://ant-design.gitee.io/] components. To make Antd compatible with `SemanticTheme`, overrides are defined in src/styles/antd-overrides. - ---- - -## Contracts - -### Tests - -Run the Mocha tests: - -```sh -$ yarn test -``` - -## Security - -While the code was written with an attention for quality and with extensive test coverage, you shouldn't assume that this library is completely safe to use. The contracts -have not yet been audited by a security researcher. If you discover any security issues, please report them in a DM on Discord. - -## Acknowledgements - -Juicebox is made possible by Ethereum, and a few libraries made by inspiring developers and teams: - -- [OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) -- Austin Griffith's [Scaffold ETH](https://github.com/austintgriffith/scaffold-eth) -- Paul Razvan Berg's [DS Math](https://github.com/paulrberg/contracts) -- Chainlink's [price oracles](https://github.com/smartcontractkit/chainlink) diff --git a/packages/app/app.template.yaml b/app.template.yaml similarity index 100% rename from packages/app/app.template.yaml rename to app.template.yaml diff --git a/packages/app/app.yaml b/app.yaml similarity index 100% rename from packages/app/app.yaml rename to app.yaml diff --git a/gas.txt b/gas.txt deleted file mode 100644 index aa62973bbe..0000000000 --- a/gas.txt +++ /dev/null @@ -1,91 +0,0 @@ -·----------------------------------------------|---------------------------|---------------|----------------------------· -| Solc version: 0.8.6 · Optimizer enabled: true · Runs: 10000 · Block limit: 6718946 gas │ -···············································|···························|···············|····························· -| Methods │ -······················|························|·············|·············|···············|··············|·············· -| Contract · Method · Min · Max · Avg · # calls · usd (avg) │ -······················|························|·············|·············|···············|··············|·············· -| ERC20 · transferFrom · 34872 · 45284 · 40775 · 60 · - │ -······················|························|·············|·············|···············|··············|·············· -| Governance · acceptGovernance · - · - · 35294 · 30 · - │ -······················|························|·············|·············|···············|··············|·············· -| Governance · addPriceFeed · 79409 · 79421 · 79420 · 60 · - │ -······················|························|·············|·············|···············|··············|·············· -| Governance · allowMigration · 53153 · 53177 · 53176 · 270 · - │ -······················|························|·············|·············|···············|··············|·············· -| Governance · appointGovernance · 33240 · 53140 · 35911 · 167 · - │ -······················|························|·············|·············|···············|··············|·············· -| Governance · setFee · 20464 · 52576 · 35397 · 180 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · acceptGovernance · 26850 · 29650 · 28709 · 116 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · appointGovernance · - · - · 30263 · 90 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · configure · 74713 · 277458 · 175870 · 1905 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · deploy · 267083 · 481223 · 323743 · 1921 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · migrate · 105541 · 149714 · 126208 · 300 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · pay · 59059 · 161914 · 114975 · 2678 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · printPreminedTickets · 76911 · 153881 · 124021 · 630 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · printReservedTickets · 53146 · 208465 · 130772 · 627 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · redeem · 59760 · 137924 · 106453 · 996 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · setFee · 14875 · 46861 · 29442 · 60 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalV1 · tap · 78601 · 566217 · 206396 · 1620 · - │ -······················|························|·············|·············|···············|··············|·············· -| ModStore · setPayoutMods · 88478 · 88526 · 88509 · 90 · - │ -······················|························|·············|·············|···············|··············|·············· -| ModStore · setTicketMods · 57602 · 60438 · 60313 · 90 · - │ -······················|························|·············|·············|···············|··············|·············· -| OperatorStore · setOperator · 15601 · 48374 · 33050 · 6030 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · challengeHandle · 47892 · 47940 · 47925 · 180 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · claimHandle · 24983 · 36866 · 30554 · 339 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · create · 108415 · 184712 · 160870 · 3480 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · renewHandle · 17895 · 36113 · 27782 · 240 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · setHandle · 45562 · 45622 · 45594 · 150 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · setUri · 19162 · 49603 · 32358 · 433 · - │ -······················|························|·············|·············|···············|··············|·············· -| Projects · transferHandle · 69015 · 69063 · 69046 · 231 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalDirectory · deployAddress · 504842 · 542556 · 530547 · 120 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalDirectory · setPayerPreferences · 18884 · 68108 · 36131 · 150 · - │ -······················|························|·············|·············|···············|··············|·············· -| TerminalDirectory · setTerminal · 41653 · 53157 · 46290 · 149 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · issue · 1348038 · 1348294 · 1348222 · 360 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · lock · 72044 · 72176 · 72111 · 38 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · stake · 27933 · 90198 · 43899 · 122 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · transfer · 40764 · 55884 · 52068 · 128 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · unlock · 17736 · 17802 · 17763 · 56 · - │ -······················|························|·············|·············|···············|··············|·············· -| TicketBooth · unstake · 28643 · 91617 · 80140 · 228 · - │ -······················|························|·············|·············|···············|··············|·············· -| Deployments · · % of limit · │ -···············································|·············|·············|···············|··············|·············· -| Active14DaysFundingCycleBallot · - · - · 137593 · 2 % · - │ -···············································|·············|·············|···············|··············|·············· -| ExampleETHUSDPriceFeed · - · - · 178489 · 2.7 % · - │ -···············································|·············|·············|···············|··············|·············· -| ExampleFailingFundingCycleBallot · - · - · 152365 · 2.3 % · - │ -···············································|·············|·············|···············|··············|·············· -| ExampleModAllocator · - · - · 93375 · 1.4 % · - │ -···············································|·············|·············|···············|··············|·············· -| TerminalV1 · - · - · 5213253 · 77.6 % · - │ -·----------------------------------------------|-------------|-------------|---------------|--------------|-------------· \ No newline at end of file diff --git a/package.json b/package.json index 8222edba9c..346b17ced9 100644 --- a/package.json +++ b/package.json @@ -1,64 +1,66 @@ { - "name": "@jbox/juicehouse", - "version": "1.0.0", - "keywords": [ - "ethereum", - "react", - "uniswap", - "workspaces", - "yarn" - ], + "name": "@jbox/app", + "version": "0.1.0", "private": true, + "dependencies": { + "@reduxjs/toolkit": "^1.5.0", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "@types/react-redux": "^7.1.16", + "@uniswap/sdk": "^3.0.3", + "@walletconnect/web3-provider": "^1.5.4", + "antd": "^4.16.7", + "autolinker": "^3.14.3", + "axios": "^0.21.1", + "bnc-notify": "^1.9.1", + "bnc-onboard": "^1.34.2", + "env-cmd": "^10.1.0", + "erc-20-abi": "^1.0.0", + "ethereum-block-by-date": "^1.4.2", + "ethers": "^5.1.0", + "react": "^17", + "react-dom": "^17.0.1", + "react-redux": "^7.2.2", + "react-router-dom": "^5.2.0", + "react-scripts": "4.0.1", + "recharts": "^2.1.2", + "sass": "^1.38.1", + "typescript": "^4.0.3", + "use-deep-compare-effect": "^1.6.1", + "web-vitals": "^0.2.4" + }, "scripts": { - "app:build": "yarn workspace @jbox/app build --max-old-space-size=12288", - "app:eject": "yarn workspace @jbox/app eject", - "app:test": "yarn workspace @jbox/app test", - "start": "yarn workspace @jbox/app start", - "chain": "yarn workspace @jbox/sol chain", - "test": "yarn workspace @jbox/sol test", - "test:gas": "yarn workspace @jbox/sol test:gas", - "test:unit": "yarn workspace @jbox/sol test:unit", - "test:integration": "yarn workspace @jbox/sol test:integration", - "compile": "yarn workspace @jbox/sol compile", - "compile-styles": "yarn workspace @jbox/app compile-styles", - "format": "prettier --write './packages/{app,hardhat}/!(build|node_modules|artifacts|cache)/**/*.*(js|jsx|ts|tsx)'", - "pretty-quick": "pretty-quick --staged --pattern './packages/{app,hardhat}/!(build|node_modules|artifacts|cache)/**/*.*(js|jsx|ts|tsx)'", - "deploy-local": "yarn workspace @jbox/sol deploy-local", - "deploy-OElocal": "yarn workspace @jbox/sol deploy-OElocal", - "deploy-ropsten": "yarn workspace @jbox/sol deploy-ropsten", - "deploy-kovan": "yarn workspace @jbox/sol deploy-kovan", - "deploy-OEkovan": "yarn workspace @jbox/sol deploy-OEkovan", - "deploy-rinkeby": "yarn workspace @jbox/sol deploy-rinkeby", - "deploy-mainnet": "yarn workspace @jbox/sol deploy-mainnet", - "watch": "yarn workspace @jbox/sol watch", - "accounts": "yarn workspace @jbox/sol accounts", - "balance": "yarn workspace @jbox/sol balance", - "send": "yarn workspace @jbox/sol send", - "surge": "yarn workspace @jbox/app surge", - "s3": "yarn workspace @jbox/app s3", - "ship": "yarn workspace @jbox/app ship", - "generate": "cd packages/hardhat && npx hardhat generate", - "mine": "cd packages/hardhat && npx hardhat mine", - "account": "cd packages/hardhat && npx hardhat account", - "wallet": "cd packages/hardhat && npx hardhat wallet", - "fundedwallet": "cd packages/hardhat && npx hardhat fundedwallet", - "flatten": "cd packages/hardhat && npx hardhat flatten" + "compile-styles": "lessc ./src/styles/antd.less ./src/styles/antd.css --js", + "start": "yarn compile-styles && react-scripts start", + "build": "yarn compile-styles && react-scripts build", + "test": "yarn compile-styles && react-scripts test", + "eject": "react-scripts eject" }, - "husky": { - "hooks": { - "pre-commit": "yarn pretty-quick && yarn compile" - } + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] }, - "workspaces": { - "packages": [ - "packages/*" + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" ] }, "devDependencies": { - "husky": "^4.3.7", - "pretty-quick": "^3.1.0" - }, - "dependencies": { - "bip39": "^3.0.4" + "@types/jest": "^26.0.15", + "@types/node": "^12.0.0", + "@types/react": "^17", + "@types/react-dom": "^17", + "@types/react-router-dom": "^5.1.7", + "less": "^4.1.1" } } diff --git a/packages/app/README.md b/packages/app/README.md deleted file mode 100644 index b58e0af830..0000000000 --- a/packages/app/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `yarn start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### `yarn test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `yarn build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `yarn eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/packages/app/package.json b/packages/app/package.json deleted file mode 100644 index 346b17ced9..0000000000 --- a/packages/app/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@jbox/app", - "version": "0.1.0", - "private": true, - "dependencies": { - "@reduxjs/toolkit": "^1.5.0", - "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.1.0", - "@testing-library/user-event": "^12.1.10", - "@types/react-redux": "^7.1.16", - "@uniswap/sdk": "^3.0.3", - "@walletconnect/web3-provider": "^1.5.4", - "antd": "^4.16.7", - "autolinker": "^3.14.3", - "axios": "^0.21.1", - "bnc-notify": "^1.9.1", - "bnc-onboard": "^1.34.2", - "env-cmd": "^10.1.0", - "erc-20-abi": "^1.0.0", - "ethereum-block-by-date": "^1.4.2", - "ethers": "^5.1.0", - "react": "^17", - "react-dom": "^17.0.1", - "react-redux": "^7.2.2", - "react-router-dom": "^5.2.0", - "react-scripts": "4.0.1", - "recharts": "^2.1.2", - "sass": "^1.38.1", - "typescript": "^4.0.3", - "use-deep-compare-effect": "^1.6.1", - "web-vitals": "^0.2.4" - }, - "scripts": { - "compile-styles": "lessc ./src/styles/antd.less ./src/styles/antd.css --js", - "start": "yarn compile-styles && react-scripts start", - "build": "yarn compile-styles && react-scripts build", - "test": "yarn compile-styles && react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@types/jest": "^26.0.15", - "@types/node": "^12.0.0", - "@types/react": "^17", - "@types/react-dom": "^17", - "@types/react-router-dom": "^5.1.7", - "less": "^4.1.1" - } -} diff --git a/packages/hardhat/.eslintrc.js b/packages/hardhat/.eslintrc.js deleted file mode 100644 index 094708da22..0000000000 --- a/packages/hardhat/.eslintrc.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - env: { - mocha: true, - }, - extends: ["airbnb", "plugin:prettier/recommended"], - plugins: ["babel"], - rules: { - "prettier/prettier": ["error"], - "import/extensions": [ - "error", - "ignorePackages", - { - js: "never", - ts: "never", - }, - ], - "import/prefer-default-export": "off", - "prefer-destructuring": "off", - "prefer-template": "off", - "no-console": "off", - "func-names": "off", - }, -}; diff --git a/packages/hardhat/.example.env b/packages/hardhat/.example.env deleted file mode 100644 index fea0275385..0000000000 --- a/packages/hardhat/.example.env +++ /dev/null @@ -1 +0,0 @@ -ETHERSCAN_API_KEY=K7RTR3T28WIB5KFQRRRPNVX5DU97CDQYVG \ No newline at end of file diff --git a/packages/hardhat/constants/dai.js b/packages/hardhat/constants/dai.js deleted file mode 100644 index edbd6f10aa..0000000000 --- a/packages/hardhat/constants/dai.js +++ /dev/null @@ -1,4 +0,0 @@ -const DAI = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; - - -module.exports = { DAI }; diff --git a/packages/hardhat/constants/eth_usd_price_feed.js b/packages/hardhat/constants/eth_usd_price_feed.js deleted file mode 100644 index 76826b23d5..0000000000 --- a/packages/hardhat/constants/eth_usd_price_feed.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = network => { - switch (network) { - case "mainnet": - return "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419"; - case "kovan": - return "0x9326BFA02ADD2366b30bacB125260Af641031331"; - case "rinkeby": - return "0x8A753747A1Fa494EC906cE90E9f37563A8AF630e"; - case "optimism": - return ""; - } -}; diff --git a/packages/hardhat/constants/skip-publish.js b/packages/hardhat/constants/skip-publish.js deleted file mode 100644 index 95a33118b7..0000000000 --- a/packages/hardhat/constants/skip-publish.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = [ - "ExampleModAllocator", - "ExampleETHUSDPriceFeed", - "ExampleJuiceboxProject", - "ExampleYielder", - "ExampleFailingFundingCycleBallot", - "YearnYielder", - "Tickets", - "DirectPaymentAddress", - "ProxyPaymentAddress", - "TokenRepresentationProxy", - "Active3DaysFundingCycleBallot", - "Active7DaysFundingCycleBallot", - "Active14DaysFundingCycleBallot", -]; diff --git a/packages/hardhat/constants/weth.js b/packages/hardhat/constants/weth.js deleted file mode 100644 index b8a4b99f0e..0000000000 --- a/packages/hardhat/constants/weth.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = (network) => { - switch (network) { - case "mainnet": - return "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"; - case "kovan": - return "0xd0a1e359811322d97991e03f863a0c30c2cf029c"; - case "rinkeby": - return "0xc778417e063141139fce010982780140aa0cd5ab"; - case "optimism": - return "0x4200000000000000000000000000000000000006"; - } -}; diff --git a/packages/hardhat/contracts/Active14DaysFundingCycleBallot.sol b/packages/hardhat/contracts/Active14DaysFundingCycleBallot.sol deleted file mode 100644 index 89fa39e21b..0000000000 --- a/packages/hardhat/contracts/Active14DaysFundingCycleBallot.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminalV1.sol"; -import "./interfaces/IFundingCycleBallot.sol"; - -/** - @notice Manages votes towards approving funding cycle reconfigurations. - */ -contract Active14DaysFundingCycleBallot is IFundingCycleBallot { - // --- public stored properties --- // - - /// @notice The number of seconds that must pass for a funding cycle reconfiguration to become active. - uint256 public constant reconfigurationDelay = 1209600; // 14 days - - // --- external views --- // - - /** - @notice The time that this ballot is active for. - @dev A ballot should not be considered final until the duration has passed. - @return The durection in seconds. - */ - function duration() external pure override returns (uint256) { - return reconfigurationDelay; - } - - /** - @notice The approval state of a particular funding cycle. - @param _configured The configuration of the funding cycle to check the state of. - @return The state of the provided ballot. - */ - function state(uint256, uint256 _configured) - external - view - override - returns (BallotState) - { - return - block.timestamp > _configured + reconfigurationDelay - ? BallotState.Approved - : BallotState.Active; - } -} diff --git a/packages/hardhat/contracts/Active3DaysFundingCycleBallot.sol b/packages/hardhat/contracts/Active3DaysFundingCycleBallot.sol deleted file mode 100644 index dbe8fbadf6..0000000000 --- a/packages/hardhat/contracts/Active3DaysFundingCycleBallot.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminalV1.sol"; -import "./interfaces/IFundingCycleBallot.sol"; - -/** - @notice Manages votes towards approving funding cycle reconfigurations. - */ -contract Active3DaysFundingCycleBallot is IFundingCycleBallot { - // --- public stored properties --- // - - /// @notice The number of seconds that must pass for a funding cycle reconfiguration to become active. - uint256 public constant reconfigurationDelay = 259200; // 3 days - - // --- external views --- // - - /** - @notice The time that this ballot is active for. - @dev A ballot should not be considered final until the duration has passed. - @return The durection in seconds. - */ - function duration() external pure override returns (uint256) { - return reconfigurationDelay; - } - - /** - @notice The approval state of a particular funding cycle. - @param _configured The configuration of the funding cycle to check the state of. - @return The state of the provided ballot. - */ - function state(uint256, uint256 _configured) - external - view - override - returns (BallotState) - { - return - block.timestamp > _configured + reconfigurationDelay - ? BallotState.Approved - : BallotState.Active; - } -} diff --git a/packages/hardhat/contracts/Active7DaysFundingCycleBallot.sol b/packages/hardhat/contracts/Active7DaysFundingCycleBallot.sol deleted file mode 100644 index 262bea039b..0000000000 --- a/packages/hardhat/contracts/Active7DaysFundingCycleBallot.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminalV1.sol"; -import "./interfaces/IFundingCycleBallot.sol"; - -/** - @notice Manages votes towards approving funding cycle reconfigurations. - */ -contract Active7DaysFundingCycleBallot is IFundingCycleBallot { - // --- public stored properties --- // - - /// @notice The number of seconds that must pass for a funding cycle reconfiguration to become active. - uint256 public constant reconfigurationDelay = 604800; // 7 days - - // --- external views --- // - - /** - @notice The time that this ballot is active for. - @dev A ballot should not be considered final until the duration has passed. - @return The durection in seconds. - */ - function duration() external pure override returns (uint256) { - return reconfigurationDelay; - } - - /** - @notice The approval state of a particular funding cycle. - @param _configured The configuration of the funding cycle to check the state of. - @return The state of the provided ballot. - */ - function state(uint256, uint256 _configured) - external - view - override - returns (BallotState) - { - return - block.timestamp > _configured + reconfigurationDelay - ? BallotState.Approved - : BallotState.Active; - } -} diff --git a/packages/hardhat/contracts/DirectPaymentAddress.sol b/packages/hardhat/contracts/DirectPaymentAddress.sol deleted file mode 100644 index 63ecb60a88..0000000000 --- a/packages/hardhat/contracts/DirectPaymentAddress.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/IDirectPaymentAddress.sol"; -import "./interfaces/ITerminalDirectory.sol"; - -/** - @notice - A contract that can receive funds directly and forward to a project's current terminal. -*/ -contract DirectPaymentAddress is IDirectPaymentAddress { - // --- public immutable stored properties --- // - - /// @notice The directory to use when resolving which terminal to send the payment to. - ITerminalDirectory public immutable override terminalDirectory; - - /// @notice The ID of the project to pay when this contract receives funds. - uint256 public immutable override projectId; - - // --- public stored properties --- // - - /// @notice The memo to use when this contract forwards a payment to a terminal. - string public override memo; - - // --- external transactions --- // - - /** - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - @param _projectId The ID of the project to pay when this contract receives funds. - @param _memo The memo to use when this contract forwards a payment to a terminal. - */ - constructor( - ITerminalDirectory _terminalDirectory, - uint256 _projectId, - string memory _memo - ) { - terminalDirectory = _terminalDirectory; - projectId = _projectId; - memo = _memo; - } - - // Receive funds and make a payment to the project's current terminal. - receive() external payable { - // Check to see if the sender has configured a beneficiary. - address _storedBeneficiary = terminalDirectory.beneficiaryOf( - msg.sender - ); - // If no beneficiary is configured, use the sender's address. - address _beneficiary = _storedBeneficiary != address(0) - ? _storedBeneficiary - : msg.sender; - - bool _preferUnstakedTickets = terminalDirectory - .unstakedTicketsPreferenceOf(msg.sender); - - terminalDirectory.terminalOf(projectId).pay{value: msg.value}( - projectId, - _beneficiary, - memo, - _preferUnstakedTickets - ); - - emit Forward( - msg.sender, - projectId, - _beneficiary, - msg.value, - memo, - _preferUnstakedTickets - ); - } -} diff --git a/packages/hardhat/contracts/ExampleETHUSDPriceFeed.sol b/packages/hardhat/contracts/ExampleETHUSDPriceFeed.sol deleted file mode 100644 index fcf8ab627e..0000000000 --- a/packages/hardhat/contracts/ExampleETHUSDPriceFeed.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; - -// A static price feed contract to use locally. -contract ExampleETHUSDPriceFeed is AggregatorV3Interface { - function decimals() external pure override returns (uint8) { - return 18; - } - - function description() external pure override returns (string memory) { - return "Static ETH/USD price feed. Do not use in production."; - } - - function version() external pure override returns (uint256) { - return 0; - } - - function getRoundData(uint80) - external - pure - override - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ) - { - return (0, 2000E18, 0, 0, 0); - } - - function latestRoundData() - external - pure - override - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ) - { - return (0, 2000E18, 0, 0, 0); - } -} diff --git a/packages/hardhat/contracts/ExampleFailingFundingCycleBallot.sol b/packages/hardhat/contracts/ExampleFailingFundingCycleBallot.sol deleted file mode 100644 index 9525dc4d1a..0000000000 --- a/packages/hardhat/contracts/ExampleFailingFundingCycleBallot.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminalV1.sol"; -import "./interfaces/IFundingCycleBallot.sol"; - -contract ExampleFailingFundingCycleBallot is IFundingCycleBallot { - uint256 public constant reconfigurationDelay = 1209600; - - function duration() external pure override returns (uint256) { - return reconfigurationDelay; - } - - function state(uint256, uint256 _configured) - external - view - override - returns (BallotState) - { - return - // Fails halfway through - block.timestamp > _configured + (reconfigurationDelay / 2) - ? BallotState.Failed - : BallotState.Active; - } -} diff --git a/packages/hardhat/contracts/ExampleJuiceboxProject.sol b/packages/hardhat/contracts/ExampleJuiceboxProject.sol deleted file mode 100644 index b5e1634c2d..0000000000 --- a/packages/hardhat/contracts/ExampleJuiceboxProject.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./abstract/JuiceboxProject.sol"; - -/// @dev For testing purposes. -contract ExampleJuiceboxProject is JuiceboxProject { - constructor(uint256 _projectId, ITerminalDirectory _terminalDirectory) - JuiceboxProject(_projectId, _terminalDirectory) - {} - - function takeFee( - uint256 _amount, - address _beneficiary, - string calldata _memo, - bool _preferUnstakedTickets - ) external { - _takeFee(_amount, _beneficiary, _memo, _preferUnstakedTickets); - } -} diff --git a/packages/hardhat/contracts/ExampleModAllocator.sol b/packages/hardhat/contracts/ExampleModAllocator.sol deleted file mode 100644 index 313f5776db..0000000000 --- a/packages/hardhat/contracts/ExampleModAllocator.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/IModAllocator.sol"; - -// A static mod allocator contract to use locally. -contract ExampleModAllocator is IModAllocator { - function allocate( - uint256 _projectId, - uint256 _forProjectId, - address _beneficiary - ) external payable override {} -} diff --git a/packages/hardhat/contracts/ExampleYielder.sol b/packages/hardhat/contracts/ExampleYielder.sol deleted file mode 100644 index 6004bcada6..0000000000 --- a/packages/hardhat/contracts/ExampleYielder.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/IYielder.sol"; - -/// @dev For testing purposes. -contract ExampleYielder is IYielder { - function deposited() external pure override returns (uint256) { - return 0; - } - - function getCurrentBalance() external pure override returns (uint256) { - return 0; - } - - function deposit() external payable override {} - - function withdraw(uint256 _amount, address payable _beneficiary) - external - override - {} - - function withdrawAll(address payable _beneficiary) - external - override - returns (uint256) - {} -} diff --git a/packages/hardhat/contracts/FundingCycles.sol b/packages/hardhat/contracts/FundingCycles.sol deleted file mode 100644 index bfa315e3e2..0000000000 --- a/packages/hardhat/contracts/FundingCycles.sol +++ /dev/null @@ -1,1384 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0; - -import "@paulrberg/contracts/math/PRBMath.sol"; - -import "./interfaces/IFundingCycles.sol"; -import "./interfaces/IPrices.sol"; -import "./abstract/TerminalUtility.sol"; - -/** - @notice Manage funding cycle configurations, accounting, and scheduling. -*/ -contract FundingCycles is TerminalUtility, IFundingCycles { - // --- private stored contants --- // - - // The number of seconds in a day. - uint256 private constant SECONDS_IN_DAY = 86400; - - // --- private stored properties --- // - - // Stores the reconfiguration properties of each funding cycle, packed into one storage slot. - mapping(uint256 => uint256) private _packedConfigurationPropertiesOf; - - // Stores the properties added by the mechanism to manage and schedule each funding cycle, packed into one storage slot. - mapping(uint256 => uint256) private _packedIntrinsicPropertiesOf; - - // Stores the metadata for each funding cycle, packed into one storage slot. - mapping(uint256 => uint256) private _metadataOf; - - // Stores the amount that each funding cycle can tap funding cycle. - mapping(uint256 => uint256) private _targetOf; - - // Stores the amount that has been tapped within each funding cycle. - mapping(uint256 => uint256) private _tappedOf; - - // --- public stored constants --- // - - /// @notice The weight used for each project's first funding cycle. - uint256 public constant override BASE_WEIGHT = 1E24; - - /// @notice The maximum value that a cycle limit can be set to. - uint256 public constant override MAX_CYCLE_LIMIT = 32; - - // --- public stored properties --- // - - /// @notice The ID of the latest funding cycle for each project. - mapping(uint256 => uint256) public override latestIdOf; - - /// @notice The total number of funding cycles created, which is used for issuing funding cycle IDs. - /// @dev Funding cycles have IDs > 0. - uint256 public override count = 0; - - // --- external views --- // - - /** - @notice - Get the funding cycle with the given ID. - - @param _fundingCycleId The ID of the funding cycle to get. - - @return _fundingCycle The funding cycle. - */ - function get(uint256 _fundingCycleId) - external - view - override - returns (FundingCycle memory) - { - // The funding cycle should exist. - require( - _fundingCycleId > 0 && _fundingCycleId <= count, - "FundingCycle::get: NOT_FOUND" - ); - - return _getStruct(_fundingCycleId); - } - - /** - @notice - The funding cycle that's next up for a project, and therefor not currently accepting payments. - - @dev - This runs roughly similar logic to `_configurable`. - - @param _projectId The ID of the project being looked through. - - @return _fundingCycle The queued funding cycle. - */ - function queuedOf(uint256 _projectId) - external - view - override - returns (FundingCycle memory) - { - // The project must have funding cycles. - if (latestIdOf[_projectId] == 0) return _getStruct(0); - - // Get a reference to the standby funding cycle. - uint256 _fundingCycleId = _standby(_projectId); - - // If it exists, return it. - if (_fundingCycleId > 0) return _getStruct(_fundingCycleId); - - // Get a reference to the eligible funding cycle. - _fundingCycleId = _eligible(_projectId); - - // If an eligible funding cycle exists... - if (_fundingCycleId > 0) { - // Get the necessary properties for the standby funding cycle. - FundingCycle memory _fundingCycle = _getStruct(_fundingCycleId); - - // There's no queued if the current has a duration of 0. - if (_fundingCycle.duration == 0) return _getStruct(0); - - // Check to see if the correct ballot is approved for this funding cycle. - // If so, return a funding cycle based on it. - if (_isApproved(_fundingCycle)) - return _mockFundingCycleBasedOn(_fundingCycle, false); - - // If it hasn't been approved, set the ID to be its base funding cycle, which carries the last approved configuration. - _fundingCycleId = _fundingCycle.basedOn; - } else { - // No upcoming funding cycle found that is eligible to become active, - // so use the ID of the latest active funding cycle, which carries the last approved configuration. - _fundingCycleId = latestIdOf[_projectId]; - } - - // A funding cycle must exist. - if (_fundingCycleId == 0) return _getStruct(0); - - // Return a mock of what its second next up funding cycle would be. - // Use second next because the next would be a mock of the current funding cycle. - return _mockFundingCycleBasedOn(_getStruct(_fundingCycleId), false); - } - - /** - @notice - The funding cycle that is currently active for the specified project. - - @dev - This runs very similar logic to `_tappable`. - - @param _projectId The ID of the project being looked through. - - @return fundingCycle The current funding cycle. - */ - function currentOf(uint256 _projectId) - external - view - override - returns (FundingCycle memory fundingCycle) - { - // The project must have funding cycles. - if (latestIdOf[_projectId] == 0) return _getStruct(0); - - // Check for an active funding cycle. - uint256 _fundingCycleId = _eligible(_projectId); - - // If no active funding cycle is found, check if there is a standby funding cycle. - // If one exists, it will become active one it has been tapped. - if (_fundingCycleId == 0) _fundingCycleId = _standby(_projectId); - - // Keep a reference to the eligible funding cycle. - FundingCycle memory _fundingCycle; - - // If a standy funding cycle exists... - if (_fundingCycleId > 0) { - // Get the necessary properties for the standby funding cycle. - _fundingCycle = _getStruct(_fundingCycleId); - - // Check to see if the correct ballot is approved for this funding cycle, and that it has started. - if ( - _fundingCycle.start <= block.timestamp && - _isApproved(_fundingCycle) - ) return _fundingCycle; - - // If it hasn't been approved, set the ID to be the based funding cycle, - // which carries the last approved configuration. - _fundingCycleId = _fundingCycle.basedOn; - } else { - // No upcoming funding cycle found that is eligible to become active, - // so us the ID of the latest active funding cycle, which carries the last approved configuration. - _fundingCycleId = latestIdOf[_projectId]; - } - - // The funding cycle cant be 0. - if (_fundingCycleId == 0) return _getStruct(0); - - // The funding cycle to base a current one on. - _fundingCycle = _getStruct(_fundingCycleId); - - // Return a mock of what the next funding cycle would be like, - // which would become active one it has been tapped. - return _mockFundingCycleBasedOn(_fundingCycle, true); - } - - /** - @notice - The currency ballot state of the project. - - @param _projectId The ID of the project to check for a pending reconfiguration. - - @return The current ballot's state. - */ - function currentBallotStateOf(uint256 _projectId) - external - view - override - returns (BallotState) - { - // The project must have funding cycles. - require( - latestIdOf[_projectId] > 0, - "FundingCycles::currentBallotStateOf: NOT_FOUND" - ); - - // Get a reference to the latest funding cycle ID. - uint256 _fundingCycleId = latestIdOf[_projectId]; - - // Get the necessary properties for the latest funding cycle. - FundingCycle memory _fundingCycle = _getStruct(_fundingCycleId); - - // If the latest funding cycle is the first, or if it has already started, it must be approved. - if (_fundingCycle.basedOn == 0) return BallotState.Standby; - - return - _ballotState( - _fundingCycleId, - _fundingCycle.configured, - _fundingCycle.basedOn - ); - } - - // --- external transactions --- // - - /** - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor(ITerminalDirectory _terminalDirectory) - TerminalUtility(_terminalDirectory) - {} - - /** - @notice - Configures the next eligible funding cycle for the specified project. - - @dev - Only a project's current terminal can configure its funding cycles. - - @param _projectId The ID of the project being reconfigured. - @param _properties The funding cycle configuration. - @dev _properties.target The amount that the project wants to receive in each funding cycle. 18 decimals. - @dev _properties.currency The currency of the `_target`. Send 0 for ETH or 1 for USD. - @dev _properties.duration The duration of the funding cycle for which the `_target` amount is needed. Measured in days. - Set to 0 for no expiry and to be able to reconfigure anytime. - @dev _cycleLimit The number of cycles that this configuration should last for before going back to the last permanent. This does nothing for a project's first funding cycle. - @dev _properties.discountRate A number from 0-200 indicating how valuable a contribution to this funding cycle is compared to previous funding cycles. - If it's 0, each funding cycle will have equal weight. - If the number is 100, a contribution to the next funding cycle will only give you 90% of tickets given to a contribution of the same amount during the current funding cycle. - If the number is 200, a contribution to the next funding cycle will only give you 80% of tickets given to a contribution of the same amoutn during the current funding cycle. - If the number is 201, an non-recurring funding cycle will get made. - @dev _ballot The new ballot that will be used to approve subsequent reconfigurations. - @param _metadata Data to associate with this funding cycle configuration. - @param _fee The fee that this configuration will incure when tapping. - @param _configureActiveFundingCycle If a funding cycle that has already started should be configurable. - - @return fundingCycle The funding cycle that the configuration will take effect during. - */ - function configure( - uint256 _projectId, - FundingCycleProperties calldata _properties, - uint256 _metadata, - uint256 _fee, - bool _configureActiveFundingCycle - ) - external - override - onlyTerminal(_projectId) - returns (FundingCycle memory fundingCycle) - { - // Duration must fit in a uint16. - require( - _properties.duration <= type(uint16).max, - "FundingCycles::configure: BAD_DURATION" - ); - - // Currency must be less than the limit. - require( - _properties.cycleLimit <= MAX_CYCLE_LIMIT, - "FundingCycles::configure: BAD_CYCLE_LIMIT" - ); - - // Discount rate token must be less than or equal to 100%. - require( - _properties.discountRate <= 201, - "FundingCycles::configure: BAD_DISCOUNT_RATE" - ); - - // Currency must fit into a uint8. - require( - _properties.currency <= type(uint8).max, - "FundingCycles::configure: BAD_CURRENCY" - ); - - // Fee must be less than or equal to 100%. - require(_fee <= 200, "FundingCycles::configure: BAD_FEE"); - - // Set the configuration timestamp is now. - uint256 _configured = block.timestamp; - - // Gets the ID of the funding cycle to reconfigure. - uint256 _fundingCycleId = _configurable( - _projectId, - _configured, - _configureActiveFundingCycle - ); - - // Store the configuration. - _packAndStoreConfigurationProperties( - _fundingCycleId, - _configured, - _properties.cycleLimit, - _properties.ballot, - _properties.duration, - _properties.currency, - _fee, - _properties.discountRate - ); - - // Set the target amount. - _targetOf[_fundingCycleId] = _properties.target; - - // Set the metadata. - _metadataOf[_fundingCycleId] = _metadata; - - emit Configure( - _fundingCycleId, - _projectId, - _configured, - _properties, - _metadata, - msg.sender - ); - - return _getStruct(_fundingCycleId); - } - - /** - @notice - Tap funds from a project's currently tappable funding cycle. - - @dev - Only a project's current terminal can tap funds for its funding cycles. - - @param _projectId The ID of the project being tapped. - @param _amount The amount being tapped. - - @return fundingCycle The tapped funding cycle. - */ - function tap(uint256 _projectId, uint256 _amount) - external - override - onlyTerminal(_projectId) - returns (FundingCycle memory fundingCycle) - { - // Get a reference to the funding cycle being tapped. - uint256 fundingCycleId = _tappable(_projectId); - - // Get a reference to how much has already been tapped from this funding cycle. - uint256 _tapped = _tappedOf[fundingCycleId]; - - // Amount must be within what is still tappable. - require( - _amount <= _targetOf[fundingCycleId] - _tapped, - "FundingCycles::tap: INSUFFICIENT_FUNDS" - ); - - // The new amount that has been tapped. - uint256 _newTappedAmount = _tapped + _amount; - - // Store the new amount. - _tappedOf[fundingCycleId] = _newTappedAmount; - - emit Tap( - fundingCycleId, - _projectId, - _amount, - _newTappedAmount, - msg.sender - ); - - return _getStruct(fundingCycleId); - } - - // --- private helper functions --- // - - /** - @notice - Returns the configurable funding cycle for this project if it exists, otherwise creates one. - - @param _projectId The ID of the project to find a configurable funding cycle for. - @param _configured The time at which the configuration is occuring. - @param _configureActiveFundingCycle If the active funding cycle should be configurable. Otherwise the next funding cycle will be used. - - @return fundingCycleId The ID of the configurable funding cycle. - */ - function _configurable( - uint256 _projectId, - uint256 _configured, - bool _configureActiveFundingCycle - ) private returns (uint256 fundingCycleId) { - // If there's not yet a funding cycle for the project, return the ID of a newly created one. - if (latestIdOf[_projectId] == 0) - return _init(_projectId, _getStruct(0), block.timestamp, false); - - // Get the standby funding cycle's ID. - fundingCycleId = _standby(_projectId); - - // If it exists, make sure its updated, then return it. - if (fundingCycleId > 0) { - // Get the funding cycle that the specified one is based on. - FundingCycle memory _baseFundingCycle = _getStruct( - _getStruct(fundingCycleId).basedOn - ); - - // The base's ballot must have ended. - _updateFundingCycle( - fundingCycleId, - _baseFundingCycle, - _getTimeAfterBallot(_baseFundingCycle, _configured), - false - ); - return fundingCycleId; - } - - // Get the active funding cycle's ID. - fundingCycleId = _eligible(_projectId); - - // If the ID of an eligible funding cycle exists, it's approved, and active funding cycles are configurable, return it. - if (fundingCycleId > 0) { - if (!_isIdApproved(fundingCycleId)) { - // If it hasn't been approved, set the ID to be the based funding cycle, - // which carries the last approved configuration. - fundingCycleId = _getStruct(fundingCycleId).basedOn; - } else if (_configureActiveFundingCycle) { - return fundingCycleId; - } - } else { - // Get the ID of the latest funding cycle which has the latest reconfiguration. - fundingCycleId = latestIdOf[_projectId]; - } - - // Determine if the configurable funding cycle can only take effect on or after a certain date. - uint256 _mustStartOnOrAfter; - - // Base off of the active funding cycle if it exists. - FundingCycle memory _fundingCycle = _getStruct(fundingCycleId); - - // Make sure the funding cycle is recurring. - require( - _fundingCycle.discountRate < 201, - "FundingCycles::_configurable: NON_RECURRING" - ); - - if (_configureActiveFundingCycle) { - // If the duration is zero, always go back to the original start. - if (_fundingCycle.duration == 0) { - _mustStartOnOrAfter = _fundingCycle.start; - } else { - // Set to the start time of the current active start time. - uint256 _timeFromStartMultiple = (block.timestamp - - _fundingCycle.start) % - (_fundingCycle.duration * SECONDS_IN_DAY); - _mustStartOnOrAfter = block.timestamp - _timeFromStartMultiple; - } - } else { - // The ballot must have ended. - _mustStartOnOrAfter = _getTimeAfterBallot( - _fundingCycle, - _configured - ); - } - - // Return the newly initialized configurable funding cycle. - fundingCycleId = _init( - _projectId, - _fundingCycle, - _mustStartOnOrAfter, - false - ); - } - - /** - @notice - Returns the funding cycle that can be tapped at the time of the call. - - @param _projectId The ID of the project to find a configurable funding cycle for. - - @return fundingCycleId The ID of the tappable funding cycle. - */ - function _tappable(uint256 _projectId) - private - returns (uint256 fundingCycleId) - { - // Check for the ID of an eligible funding cycle. - fundingCycleId = _eligible(_projectId); - - // No eligible funding cycle found, check for the ID of a standby funding cycle. - // If this one exists, it will become eligible one it has started. - if (fundingCycleId == 0) fundingCycleId = _standby(_projectId); - - // Keep a reference to the funding cycle eligible for being tappable. - FundingCycle memory _fundingCycle; - - // If the ID of an eligible funding cycle exists, - // check to see if it has been approved by the based funding cycle's ballot. - if (fundingCycleId > 0) { - // Get the necessary properties for the funding cycle. - _fundingCycle = _getStruct(fundingCycleId); - - // Check to see if the cycle is approved. If so, return it. - if ( - _fundingCycle.start <= block.timestamp && - _isApproved(_fundingCycle) - ) return fundingCycleId; - - // If it hasn't been approved, set the ID to be the base funding cycle, - // which carries the last approved configuration. - fundingCycleId = _fundingCycle.basedOn; - } else { - // No upcoming funding cycle found that is eligible to become active, clone the latest active funding cycle. - // which carries the last approved configuration. - fundingCycleId = latestIdOf[_projectId]; - } - - // The funding cycle cant be 0. - require(fundingCycleId > 0, "FundingCycles::_tappable: NOT_FOUND"); - - // Set the eligible funding cycle. - _fundingCycle = _getStruct(fundingCycleId); - - // Funding cycles with a discount rate of 100% are non-recurring. - require( - _fundingCycle.discountRate < 201, - "FundingCycles::_tappable: NON_RECURRING" - ); - - // The time when the funding cycle immediately after the eligible funding cycle starts. - uint256 _nextImmediateStart = _fundingCycle.start + - (_fundingCycle.duration * SECONDS_IN_DAY); - - // The distance from now until the nearest past multiple of the cycle duration from its start. - // A duration of zero means the reconfiguration can start right away. - uint256 _timeFromImmediateStartMultiple = _fundingCycle.duration == 0 - ? 0 - : (block.timestamp - _nextImmediateStart) % - (_fundingCycle.duration * SECONDS_IN_DAY); - - // Return the tappable funding cycle. - fundingCycleId = _init( - _projectId, - _fundingCycle, - block.timestamp - _timeFromImmediateStartMultiple, - true - ); - } - - /** - @notice - Initializes a funding cycle with the appropriate properties. - - @param _projectId The ID of the project to which the funding cycle being initialized belongs. - @param _baseFundingCycle The funding cycle to base the initialized one on. - @param _mustStartOnOrAfter The time before which the initialized funding cycle can't start. - @param _copy If non-intrinsic properties should be copied from the base funding cycle. - - @return newFundingCycleId The ID of the initialized funding cycle. - */ - function _init( - uint256 _projectId, - FundingCycle memory _baseFundingCycle, - uint256 _mustStartOnOrAfter, - bool _copy - ) private returns (uint256 newFundingCycleId) { - // Increment the count of funding cycles. - count++; - - // Set the project's latest funding cycle ID to the new count. - latestIdOf[_projectId] = count; - - // If there is no base, initialize a first cycle. - if (_baseFundingCycle.id == 0) { - // Set fresh intrinsic properties. - _packAndStoreIntrinsicProperties( - count, - _projectId, - BASE_WEIGHT, - 1, - 0, - block.timestamp - ); - } else { - // Update the intrinsic properties of the funding cycle being initialized. - _updateFundingCycle( - count, - _baseFundingCycle, - _mustStartOnOrAfter, - _copy - ); - } - - // Get a reference to the funding cycle with updated intrinsic properties. - FundingCycle memory _fundingCycle = _getStruct(count); - - emit Init( - count, - _fundingCycle.projectId, - _fundingCycle.number, - _fundingCycle.basedOn, - _fundingCycle.weight, - _fundingCycle.start - ); - - return _fundingCycle.id; - } - - /** - @notice - The project's funding cycle that hasn't yet started, if one exists. - - @param _projectId The ID of project to look through. - - @return fundingCycleId The ID of the standby funding cycle. - */ - function _standby(uint256 _projectId) - private - view - returns (uint256 fundingCycleId) - { - // Get a reference to the project's latest funding cycle. - fundingCycleId = latestIdOf[_projectId]; - - // If there isn't one, theres also no standy funding cycle. - if (fundingCycleId == 0) return 0; - - // Get the necessary properties for the latest funding cycle. - FundingCycle memory _fundingCycle = _getStruct(fundingCycleId); - - // There is no upcoming funding cycle if the latest funding cycle has already started. - if (block.timestamp >= _fundingCycle.start) return 0; - } - - /** - @notice - The project's funding cycle that has started and hasn't yet expired. - - @param _projectId The ID of the project to look through. - - @return fundingCycleId The ID of the active funding cycle. - */ - function _eligible(uint256 _projectId) - private - view - returns (uint256 fundingCycleId) - { - // Get a reference to the project's latest funding cycle. - fundingCycleId = latestIdOf[_projectId]; - - // If the latest funding cycle doesn't exist, return an undefined funding cycle. - if (fundingCycleId == 0) return 0; - - // Get the necessary properties for the latest funding cycle. - FundingCycle memory _fundingCycle = _getStruct(fundingCycleId); - - // If the latest is expired, return an undefined funding cycle. - // A duration of 0 can not be expired. - if ( - _fundingCycle.duration > 0 && - block.timestamp >= - _fundingCycle.start + (_fundingCycle.duration * SECONDS_IN_DAY) - ) return 0; - - // The first funding cycle when running on local can be in the future for some reason. - // This will have no effect in production. - if ( - _fundingCycle.basedOn == 0 || block.timestamp >= _fundingCycle.start - ) return fundingCycleId; - - // The base cant be expired. - FundingCycle memory _baseFundingCycle = _getStruct( - _fundingCycle.basedOn - ); - - // If the current time is past the end of the base, return 0. - // A duration of 0 is always eligible. - if ( - _baseFundingCycle.duration > 0 && - block.timestamp >= - _baseFundingCycle.start + - (_baseFundingCycle.duration * SECONDS_IN_DAY) - ) return 0; - - // Return the funding cycle immediately before the latest. - fundingCycleId = _fundingCycle.basedOn; - } - - /** - @notice - A view of the funding cycle that would be created based on the provided one if the project doesn't make a reconfiguration. - - @param _baseFundingCycle The funding cycle to make the calculation for. - @param _allowMidCycle Allow the mocked funding cycle to already be mid cycle. - - @return The next funding cycle, with an ID set to 0. - */ - function _mockFundingCycleBasedOn( - FundingCycle memory _baseFundingCycle, - bool _allowMidCycle - ) internal view returns (FundingCycle memory) { - // Can't mock a non recurring funding cycle. - if (_baseFundingCycle.discountRate == 201) return _getStruct(0); - - // If the base has a limit, find the last permanent funding cycle, which is needed to make subsequent calculations. - // Otherwise, the base is already the latest permanent funding cycle. - FundingCycle memory _latestPermanentFundingCycle = _baseFundingCycle - .cycleLimit > 0 - ? _latestPermanentCycleBefore(_baseFundingCycle) - : _baseFundingCycle; - - // The distance of the current time to the start of the next possible funding cycle. - uint256 _timeFromImmediateStartMultiple; - - if (_allowMidCycle && _baseFundingCycle.duration > 0) { - // Get the end time of the last cycle. - uint256 _cycleEnd = _baseFundingCycle.start + - (_baseFundingCycle.cycleLimit * - _baseFundingCycle.duration * - SECONDS_IN_DAY); - - // If the cycle end time is in the past, the mock should start at a multiple of the last permanent cycle since the cycle ended. - if ( - _baseFundingCycle.cycleLimit > 0 && _cycleEnd < block.timestamp - ) { - _timeFromImmediateStartMultiple = _latestPermanentFundingCycle - .duration == 0 - ? 0 - : ((block.timestamp - _cycleEnd) % - (_latestPermanentFundingCycle.duration * - SECONDS_IN_DAY)); - } else { - _timeFromImmediateStartMultiple = - _baseFundingCycle.duration * - SECONDS_IN_DAY; - } - } else { - _timeFromImmediateStartMultiple = 0; - } - - // Derive what the start time should be. - uint256 _start = _deriveStart( - _baseFundingCycle, - _latestPermanentFundingCycle, - block.timestamp - _timeFromImmediateStartMultiple - ); - - // Derive what the cycle limit should be. - uint256 _cycleLimit = _deriveCycleLimit(_baseFundingCycle, _start); - - // Copy the last permanent funding cycle if the bases' limit is up. - FundingCycle memory _fundingCycleToCopy = _cycleLimit == 0 - ? _latestPermanentFundingCycle - : _baseFundingCycle; - - return - FundingCycle( - 0, - _fundingCycleToCopy.projectId, - _deriveNumber( - _baseFundingCycle, - _latestPermanentFundingCycle, - _start - ), - _fundingCycleToCopy.id, - _fundingCycleToCopy.configured, - _cycleLimit, - _deriveWeight( - _baseFundingCycle, - _latestPermanentFundingCycle, - _start - ), - _fundingCycleToCopy.ballot, - _start, - _fundingCycleToCopy.duration, - _fundingCycleToCopy.target, - _fundingCycleToCopy.currency, - _fundingCycleToCopy.fee, - _fundingCycleToCopy.discountRate, - 0, - _fundingCycleToCopy.metadata - ); - } - - /** - @notice - Updates intrinsic properties for a funding cycle given a base cycle. - - @param _fundingCycleId The ID of the funding cycle to make sure is update. - @param _baseFundingCycle The cycle that the one being updated is based on. - @param _mustStartOnOrAfter The time before which the initialized funding cycle can't start. - @param _copy If non-intrinsic properties should be copied from the base funding cycle. - */ - function _updateFundingCycle( - uint256 _fundingCycleId, - FundingCycle memory _baseFundingCycle, - uint256 _mustStartOnOrAfter, - bool _copy - ) private { - // Get the latest permanent funding cycle. - FundingCycle memory _latestPermanentFundingCycle = _baseFundingCycle - .cycleLimit > 0 - ? _latestPermanentCycleBefore(_baseFundingCycle) - : _baseFundingCycle; - - // Derive the correct next start time from the base. - uint256 _start = _deriveStart( - _baseFundingCycle, - _latestPermanentFundingCycle, - _mustStartOnOrAfter - ); - - // Derive the correct weight. - uint256 _weight = _deriveWeight( - _baseFundingCycle, - _latestPermanentFundingCycle, - _start - ); - - // Derive the correct number. - uint256 _number = _deriveNumber( - _baseFundingCycle, - _latestPermanentFundingCycle, - _start - ); - - // Copy if needed. - if (_copy) { - // Derive what the cycle limit should be. - uint256 _cycleLimit = _deriveCycleLimit(_baseFundingCycle, _start); - - // Copy the last permanent funding cycle if the bases' limit is up. - FundingCycle memory _fundingCycleToCopy = _cycleLimit == 0 - ? _latestPermanentFundingCycle - : _baseFundingCycle; - - // Save the configuration efficiently. - _packAndStoreConfigurationProperties( - _fundingCycleId, - _fundingCycleToCopy.configured, - _cycleLimit, - _fundingCycleToCopy.ballot, - _fundingCycleToCopy.duration, - _fundingCycleToCopy.currency, - _fundingCycleToCopy.fee, - _fundingCycleToCopy.discountRate - ); - - _metadataOf[count] = _metadataOf[_fundingCycleToCopy.id]; - _targetOf[count] = _targetOf[_fundingCycleToCopy.id]; - } - - // Update the intrinsic properties. - _packAndStoreIntrinsicProperties( - _fundingCycleId, - _baseFundingCycle.projectId, - _weight, - _number, - _baseFundingCycle.id, - _start - ); - } - - /** - @notice - Efficiently stores a funding cycle's provided intrinsic properties. - - @param _fundingCycleId The ID of the funding cycle to pack and store. - @param _projectId The ID of the project to which the funding cycle belongs. - @param _weight The weight of the funding cycle. - @param _number The number of the funding cycle. - @param _basedOn The ID of the based funding cycle. - @param _start The start time of this funding cycle. - - */ - function _packAndStoreIntrinsicProperties( - uint256 _fundingCycleId, - uint256 _projectId, - uint256 _weight, - uint256 _number, - uint256 _basedOn, - uint256 _start - ) private { - // weight in bytes 0-79 bytes. - uint256 packed = _weight; - // projectId in bytes 80-135 bytes. - packed |= _projectId << 80; - // basedOn in bytes 136-183 bytes. - packed |= _basedOn << 136; - // start in bytes 184-231 bytes. - packed |= _start << 184; - // number in bytes 232-255 bytes. - packed |= _number << 232; - - // Set in storage. - _packedIntrinsicPropertiesOf[_fundingCycleId] = packed; - } - - /** - @notice - Efficiently stores a funding cycles provided configuration properties. - - @param _fundingCycleId The ID of the funding cycle to pack and store. - @param _configured The timestamp of the configuration. - @param _cycleLimit The number of cycles that this configuration should last for before going back to the last permanent. - @param _ballot The ballot to use for future reconfiguration approvals. - @param _duration The duration of the funding cycle. - @param _currency The currency of the funding cycle. - @param _fee The fee of the funding cycle. - @param _discountRate The discount rate of the based funding cycle. - */ - function _packAndStoreConfigurationProperties( - uint256 _fundingCycleId, - uint256 _configured, - uint256 _cycleLimit, - IFundingCycleBallot _ballot, - uint256 _duration, - uint256 _currency, - uint256 _fee, - uint256 _discountRate - ) private { - // ballot in bytes 0-159 bytes. - uint256 packed = uint160(address(_ballot)); - // configured in bytes 160-207 bytes. - packed |= _configured << 160; - // duration in bytes 208-223 bytes. - packed |= _duration << 208; - // basedOn in bytes 224-231 bytes. - packed |= _currency << 224; - // fee in bytes 232-239 bytes. - packed |= _fee << 232; - // discountRate in bytes 240-247 bytes. - packed |= _discountRate << 240; - // cycleLimit in bytes 248-255 bytes. - packed |= _cycleLimit << 248; - - // Set in storage. - _packedConfigurationPropertiesOf[_fundingCycleId] = packed; - } - - /** - @notice - Unpack a funding cycle's packed stored values into an easy-to-work-with funding cycle struct. - - @param _id The ID of the funding cycle to get a struct of. - - @return _fundingCycle The funding cycle struct. - */ - function _getStruct(uint256 _id) - private - view - returns (FundingCycle memory _fundingCycle) - { - // Return an empty funding cycle if the ID specified is 0. - if (_id == 0) return _fundingCycle; - - _fundingCycle.id = _id; - - uint256 _packedIntrinsicProperties = _packedIntrinsicPropertiesOf[_id]; - - _fundingCycle.weight = uint256(uint80(_packedIntrinsicProperties)); - _fundingCycle.projectId = uint256( - uint56(_packedIntrinsicProperties >> 80) - ); - _fundingCycle.basedOn = uint256( - uint48(_packedIntrinsicProperties >> 136) - ); - _fundingCycle.start = uint256( - uint48(_packedIntrinsicProperties >> 184) - ); - _fundingCycle.number = uint256( - uint24(_packedIntrinsicProperties >> 232) - ); - - - uint256 _packedConfigurationProperties - = _packedConfigurationPropertiesOf[_id]; - _fundingCycle.ballot = IFundingCycleBallot( - address(uint160(_packedConfigurationProperties)) - ); - _fundingCycle.configured = uint256( - uint48(_packedConfigurationProperties >> 160) - ); - _fundingCycle.duration = uint256( - uint16(_packedConfigurationProperties >> 208) - ); - _fundingCycle.currency = uint256( - uint8(_packedConfigurationProperties >> 224) - ); - _fundingCycle.fee = uint256( - uint8(_packedConfigurationProperties >> 232) - ); - _fundingCycle.discountRate = uint256( - uint8(_packedConfigurationProperties >> 240) - ); - _fundingCycle.cycleLimit = uint256( - uint8(_packedConfigurationProperties >> 248) - ); - _fundingCycle.target = _targetOf[_id]; - _fundingCycle.tapped = _tappedOf[_id]; - _fundingCycle.metadata = _metadataOf[_id]; - } - - /** - @notice - The date that is the nearest multiple of the specified funding cycle's duration from its end. - - @param _baseFundingCycle The funding cycle to make the calculation for. - @param _latestPermanentFundingCycle The latest funding cycle in the same project as `_baseFundingCycle` to not have a limit. - @param _mustStartOnOrAfter A date that the derived start must be on or come after. - - @return start The next start time. - */ - function _deriveStart( - FundingCycle memory _baseFundingCycle, - FundingCycle memory _latestPermanentFundingCycle, - uint256 _mustStartOnOrAfter - ) internal pure returns (uint256 start) { - // A subsequent cycle to one with a duration of 0 should start as soon as possible. - if (_baseFundingCycle.duration == 0) return _mustStartOnOrAfter; - - // Save a reference to the duration measured in seconds. - uint256 _durationInSeconds = _baseFundingCycle.duration * - SECONDS_IN_DAY; - - // The time when the funding cycle immediately after the specified funding cycle starts. - uint256 _nextImmediateStart = _baseFundingCycle.start + - _durationInSeconds; - - // If the next immediate start is now or in the future, return it. - if (_nextImmediateStart >= _mustStartOnOrAfter) - return _nextImmediateStart; - - uint256 _cycleLimit = _baseFundingCycle.cycleLimit; - - uint256 _timeFromImmediateStartMultiple; - // Only use base - if ( - _mustStartOnOrAfter <= - _baseFundingCycle.start + _durationInSeconds * _cycleLimit - ) { - // Otherwise, use the closest multiple of the duration from the old end. - _timeFromImmediateStartMultiple = - (_mustStartOnOrAfter - _nextImmediateStart) % - _durationInSeconds; - } else { - // If the cycle has ended, make the calculation with the latest permanent funding cycle. - _timeFromImmediateStartMultiple = _latestPermanentFundingCycle - .duration == 0 - ? 0 - : ((_mustStartOnOrAfter - - (_baseFundingCycle.start + - (_durationInSeconds * _cycleLimit))) % - (_latestPermanentFundingCycle.duration * SECONDS_IN_DAY)); - - // Use the duration of the permanent funding cycle from here on out. - _durationInSeconds = - _latestPermanentFundingCycle.duration * - SECONDS_IN_DAY; - } - - // Otherwise use an increment of the duration from the most recent start. - start = _mustStartOnOrAfter - _timeFromImmediateStartMultiple; - - // Add increments of duration as necessary to satisfy the threshold. - while (_mustStartOnOrAfter > start) start = start + _durationInSeconds; - } - - /** - @notice - The accumulated weight change since the specified funding cycle. - - @param _baseFundingCycle The funding cycle to make the calculation with. - @param _latestPermanentFundingCycle The latest funding cycle in the same project as `_fundingCycle` to not have a limit. - @param _start The start time to derive a weight for. - - @return weight The next weight. - */ - function _deriveWeight( - FundingCycle memory _baseFundingCycle, - FundingCycle memory _latestPermanentFundingCycle, - uint256 _start - ) internal pure returns (uint256 weight) { - // A subsequent cycle to one with a duration of 0 should have the next possible weight. - if (_baseFundingCycle.duration == 0) - return - PRBMath.mulDiv( - _baseFundingCycle.weight, - 1000 - _baseFundingCycle.discountRate, - 1000 - ); - - // The difference between the start of the base funding cycle and the proposed start. - uint256 _startDistance = _start - _baseFundingCycle.start; - - // The number of seconds that the base funding cycle is limited to. - uint256 _limitLength = _baseFundingCycle.cycleLimit == 0 || - _baseFundingCycle.basedOn == 0 - ? 0 - : _baseFundingCycle.cycleLimit * - (_baseFundingCycle.duration * SECONDS_IN_DAY); - - // The weight should be based off the base funding cycle's weight. - weight = _baseFundingCycle.weight; - - // If there's no limit or if the limit is greater than the start distance, - // apply the discount rate of the base. - if (_limitLength == 0 || _limitLength > _startDistance) { - // If the discount rate is 0, return the same weight. - if (_baseFundingCycle.discountRate == 0) return weight; - - uint256 _discountMultiple = _startDistance / - (_baseFundingCycle.duration * SECONDS_IN_DAY); - - for (uint256 i = 0; i < _discountMultiple; i++) { - // The number of times to apply the discount rate. - // Base the new weight on the specified funding cycle's weight. - weight = PRBMath.mulDiv( - weight, - 1000 - _baseFundingCycle.discountRate, - 1000 - ); - } - } else { - // If the time between the base start at the given start is longer than - // the limit, the discount rate for the limited base has to be applied first, - // and then the discount rate for the last permanent should be applied to - // the remaining distance. - - // Use up the limited discount rate up until the limit. - if (_baseFundingCycle.discountRate > 0) { - for (uint256 i = 0; i < _baseFundingCycle.cycleLimit; i++) { - weight = PRBMath.mulDiv( - weight, - 1000 - _baseFundingCycle.discountRate, - 1000 - ); - } - } - - if (_latestPermanentFundingCycle.discountRate > 0) { - // The number of times to apply the latest permanent discount rate. - - - uint256 _permanentDiscountMultiple - = _latestPermanentFundingCycle.duration == 0 - ? 0 - : (_startDistance - _limitLength) / - (_latestPermanentFundingCycle.duration * - SECONDS_IN_DAY); - - for (uint256 i = 0; i < _permanentDiscountMultiple; i++) { - // base the weight on the result of the previous calculation. - weight = PRBMath.mulDiv( - weight, - 1000 - _latestPermanentFundingCycle.discountRate, - 1000 - ); - } - } - } - } - - /** - @notice - The number of the next funding cycle given the specified funding cycle. - - @param _baseFundingCycle The funding cycle to make the calculation with. - @param _latestPermanentFundingCycle The latest funding cycle in the same project as `_fundingCycle` to not have a limit. - @param _start The start time to derive a number for. - - @return number The next number. - */ - function _deriveNumber( - FundingCycle memory _baseFundingCycle, - FundingCycle memory _latestPermanentFundingCycle, - uint256 _start - ) internal pure returns (uint256 number) { - // A subsequent cycle to one with a duration of 0 should be the next number. - if (_baseFundingCycle.duration == 0) - return _baseFundingCycle.number + 1; - - // The difference between the start of the base funding cycle and the proposed start. - uint256 _startDistance = _start - _baseFundingCycle.start; - - // The number of seconds that the base funding cycle is limited to. - uint256 _limitLength = _baseFundingCycle.cycleLimit == 0 - ? 0 - : _baseFundingCycle.cycleLimit * - (_baseFundingCycle.duration * SECONDS_IN_DAY); - - if (_limitLength == 0 || _limitLength > _startDistance) { - // If there's no limit or if the limit is greater than the start distance, - // get the result by finding the number of base cycles that fit in the start distance. - number = - _baseFundingCycle.number + - (_startDistance / - (_baseFundingCycle.duration * SECONDS_IN_DAY)); - } else { - // If the time between the base start at the given start is longer than - // the limit, first calculate the number of cycles that passed under the limit, - // and add any cycles that have passed of the latest permanent funding cycle afterwards. - - number = - _baseFundingCycle.number + - (_limitLength / (_baseFundingCycle.duration * SECONDS_IN_DAY)); - - number = - number + - ( - _latestPermanentFundingCycle.duration == 0 - ? 0 - : ((_startDistance - _limitLength) / - (_latestPermanentFundingCycle.duration * - SECONDS_IN_DAY)) - ); - } - } - - /** - @notice - The limited number of times a funding cycle configuration can be active given the specified funding cycle. - - @param _fundingCycle The funding cycle to make the calculation with. - @param _start The start time to derive cycles remaining for. - - @return start The inclusive nunmber of cycles remaining. - */ - function _deriveCycleLimit( - FundingCycle memory _fundingCycle, - uint256 _start - ) internal pure returns (uint256) { - if (_fundingCycle.cycleLimit <= 1 || _fundingCycle.duration == 0) - return 0; - uint256 _cycles = ((_start - _fundingCycle.start) / - (_fundingCycle.duration * SECONDS_IN_DAY)); - - if (_cycles >= _fundingCycle.cycleLimit) return 0; - return _fundingCycle.cycleLimit - _cycles; - } - - /** - @notice - Checks to see if the funding cycle of the provided ID is approved according to the correct ballot. - - @param _fundingCycleId The ID of the funding cycle to get an approval flag for. - - @return The approval flag. - */ - function _isIdApproved(uint256 _fundingCycleId) - private - view - returns (bool) - { - FundingCycle memory _fundingCycle = _getStruct(_fundingCycleId); - return _isApproved(_fundingCycle); - } - - /** - @notice - Checks to see if the provided funding cycle is approved according to the correct ballot. - - @param _fundingCycle The ID of the funding cycle to get an approval flag for. - - @return The approval flag. - */ - function _isApproved(FundingCycle memory _fundingCycle) - private - view - returns (bool) - { - return - _ballotState( - _fundingCycle.id, - _fundingCycle.configured, - _fundingCycle.basedOn - ) == BallotState.Approved; - } - - /** - @notice - A funding cycle configuration's currency status. - - @param _id The ID of the funding cycle configuration to check the status of. - @param _configuration The timestamp of when the configuration took place. - @param _ballotFundingCycleId The ID of the funding cycle which is configured with the ballot that should be used. - - @return The funding cycle's configuration status. - */ - function _ballotState( - uint256 _id, - uint256 _configuration, - uint256 _ballotFundingCycleId - ) private view returns (BallotState) { - // If there is no ballot funding cycle, auto approve. - if (_ballotFundingCycleId == 0) return BallotState.Approved; - - // Get the ballot funding cycle. - FundingCycle memory _ballotFundingCycle = _getStruct( - _ballotFundingCycleId - ); - - // If the configuration is the same as the ballot's funding cycle, - // the ballot isn't applicable. Auto approve since the ballot funding cycle is approved. - if (_ballotFundingCycle.configured == _configuration) - return BallotState.Approved; - - // If there is no ballot, the ID is auto approved. - // Otherwise, return the ballot's state. - return - _ballotFundingCycle.ballot == IFundingCycleBallot(address(0)) - ? BallotState.Approved - : _ballotFundingCycle.ballot.state(_id, _configuration); - } - - /** - @notice - Finds the last funding cycle that was permanent in relation to the specified funding cycle. - - @dev - Determined what the latest funding cycle with a `cycleLimit` of 0 is, or isn't based on any previous funding cycle. - - - @param _fundingCycle The funding cycle to find the most recent permanent cycle compared to. - - @return fundingCycle The most recent permanent funding cycle. - */ - function _latestPermanentCycleBefore(FundingCycle memory _fundingCycle) - private - view - returns (FundingCycle memory fundingCycle) - { - if (_fundingCycle.basedOn == 0) return _fundingCycle; - fundingCycle = _getStruct(_fundingCycle.basedOn); - if (fundingCycle.cycleLimit == 0) return fundingCycle; - return _latestPermanentCycleBefore(fundingCycle); - } - - /** - @notice - The time after the ballot of the provided funding cycle has expired. - - @dev - If the ballot ends in the past, the current block timestamp will be returned. - - @param _fundingCycle The ID funding cycle to make the caluclation the ballot of. - @param _from The time from which the ballot duration should be calculated. - - @return The time when the ballot duration ends. - */ - function _getTimeAfterBallot( - FundingCycle memory _fundingCycle, - uint256 _from - ) private view returns (uint256) { - // The ballot must have ended. - uint256 _ballotExpiration = _fundingCycle.ballot != - IFundingCycleBallot(address(0)) - ? _from + _fundingCycle.ballot.duration() - : 0; - - return - block.timestamp > _ballotExpiration - ? block.timestamp - : _ballotExpiration; - } -} diff --git a/packages/hardhat/contracts/Governance.sol b/packages/hardhat/contracts/Governance.sol deleted file mode 100644 index 8829b85bce..0000000000 --- a/packages/hardhat/contracts/Governance.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminal.sol"; -import "./interfaces/IPrices.sol"; -import "./abstract/JuiceboxProject.sol"; - -/// Owner should eventually change to a multisig wallet contract. -contract Governance is JuiceboxProject { - // --- external transactions --- // - - constructor(uint256 _projectId, ITerminalDirectory _terminalDirectory) - JuiceboxProject(_projectId, _terminalDirectory) - {} - - /** - @notice Gives projects using one Terminal access to migrate to another Terminal. - @param _from The terminal to allow a new migration from. - @param _to The terminal to allow migration to. - */ - function allowMigration(ITerminal _from, ITerminal _to) external onlyOwner { - _from.allowMigration(_to); - } - - /** - @notice Adds a price feed. - @param _prices The prices contract to add a feed to. - @param _feed The price feed to add. - @param _currency The currency the price feed is for. - */ - function addPriceFeed( - IPrices _prices, - AggregatorV3Interface _feed, - uint256 _currency - ) external onlyOwner { - _prices.addFeed(_feed, _currency); - } - - /** - @notice Sets the fee of the TerminalV1. - @param _terminalV1 The terminalV1 to change the fee of. - @param _fee The new fee. - */ - function setFee(ITerminalV1 _terminalV1, uint256 _fee) external onlyOwner { - _terminalV1.setFee(_fee); - } - - /** - @notice Appoints a new governance for the specified terminalV1. - @param _terminalV1 The terminalV1 to change the governance of. - @param _newGovernance The address to appoint as governance. - */ - function appointGovernance( - ITerminalV1 _terminalV1, - address payable _newGovernance - ) external onlyOwner { - _terminalV1.appointGovernance(_newGovernance); - } - - /** - @notice Accepts the offer to be the governance of a new terminalV1. - @param _terminalV1 The terminalV1 to change the governance of. - */ - function acceptGovernance(ITerminalV1 _terminalV1) external onlyOwner { - _terminalV1.acceptGovernance(); - } -} diff --git a/packages/hardhat/contracts/ModStore.sol b/packages/hardhat/contracts/ModStore.sol deleted file mode 100644 index e8770055e0..0000000000 --- a/packages/hardhat/contracts/ModStore.sol +++ /dev/null @@ -1,272 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/IModStore.sol"; -import "./abstract/Operatable.sol"; -import "./abstract/TerminalUtility.sol"; - -import "./libraries/Operations.sol"; - -/** - @notice - Stores mods for each project. - - @dev - Mods can be used to distribute a percentage of payments or tickets to preconfigured beneficiaries. -*/ -contract ModStore is IModStore, Operatable, TerminalUtility { - // --- private stored properties --- // - - // All payout mods for each project ID's configurations. - mapping(uint256 => mapping(uint256 => PayoutMod[])) private _payoutModsOf; - - // All ticket mods for each project ID's configurations. - mapping(uint256 => mapping(uint256 => TicketMod[])) private _ticketModsOf; - - // --- public immutable stored properties --- // - - /// @notice The contract storing project information. - IProjects public immutable override projects; - - // --- public views --- // - - /** - @notice - Get all payout mods for the specified project ID. - - @param _projectId The ID of the project to get mods for. - @param _configuration The configuration to get mods for. - - @return An array of all mods for the project. - */ - function payoutModsOf(uint256 _projectId, uint256 _configuration) - external - view - override - returns (PayoutMod[] memory) - { - return _payoutModsOf[_projectId][_configuration]; - } - - /** - @notice - Get all ticket mods for the specified project ID. - - @param _projectId The ID of the project to get mods for. - @param _configuration The configuration to get mods for. - - @return An array of all mods for the project. - */ - function ticketModsOf(uint256 _projectId, uint256 _configuration) - external - view - override - returns (TicketMod[] memory) - { - return _ticketModsOf[_projectId][_configuration]; - } - - // --- external transactions --- // - - /** - @param _projects The contract storing project information - @param _operatorStore A contract storing operator assignments. - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor( - IProjects _projects, - IOperatorStore _operatorStore, - ITerminalDirectory _terminalDirectory - ) Operatable(_operatorStore) TerminalUtility(_terminalDirectory) { - projects = _projects; - } - - /** - @notice - Adds a mod to the payout mods list. - - @dev - Only the owner or operator of a project can make this call, or the current terminal of the project. - - @param _projectId The project to add a mod to. - @param _configuration The configuration to set the mods to be active during. - @param _mods The payout mods to set. - */ - function setPayoutMods( - uint256 _projectId, - uint256 _configuration, - PayoutMod[] memory _mods - ) - external - override - requirePermissionAcceptingAlternateAddress( - projects.ownerOf(_projectId), - _projectId, - Operations.SetPayoutMods, - address(terminalDirectory.terminalOf(_projectId)) - ) - { - // There must be something to do. - require(_mods.length > 0, "ModStore::setPayoutMods: NO_OP"); - - // Get a reference to the project's payout mods. - PayoutMod[] memory _currentMods = _payoutModsOf[_projectId][ - _configuration - ]; - - // Check to see if all locked Mods are included. - for (uint256 _i = 0; _i < _currentMods.length; _i++) { - if (block.timestamp < _currentMods[_i].lockedUntil) { - bool _includesLocked = false; - for (uint256 _j = 0; _j < _mods.length; _j++) { - // Check for sameness. Let the note change. - if ( - _mods[_j].percent == _currentMods[_i].percent && - _mods[_j].beneficiary == _currentMods[_i].beneficiary && - _mods[_j].allocator == _currentMods[_i].allocator && - _mods[_j].projectId == _currentMods[_i].projectId && - // Allow lock expention. - _mods[_j].lockedUntil >= _currentMods[_i].lockedUntil - ) _includesLocked = true; - } - require( - _includesLocked, - "ModStore::setPayoutMods: SOME_LOCKED" - ); - } - } - - // Delete from storage so mods can be repopulated. - delete _payoutModsOf[_projectId][_configuration]; - - // Add up all the percents to make sure they cumulative are under 100%. - uint256 _payoutModPercentTotal = 0; - - for (uint256 _i = 0; _i < _mods.length; _i++) { - // The percent should be greater than 0. - require( - _mods[_i].percent > 0, - "ModStore::setPayoutMods: BAD_MOD_PERCENT" - ); - - // Add to the total percents. - _payoutModPercentTotal = _payoutModPercentTotal + _mods[_i].percent; - - // The total percent should be less than 10000. - require( - _payoutModPercentTotal <= 10000, - "ModStore::setPayoutMods: BAD_TOTAL_PERCENT" - ); - - // The allocator and the beneficiary shouldn't both be the zero address. - require( - _mods[_i].allocator != IModAllocator(address(0)) || - _mods[_i].beneficiary != address(0), - "ModStore::setPayoutMods: ZERO_ADDRESS" - ); - - // Push the new mod into the project's list of mods. - _payoutModsOf[_projectId][_configuration].push(_mods[_i]); - - emit SetPayoutMod( - _projectId, - _configuration, - _mods[_i], - msg.sender - ); - } - } - - /** - @notice - Adds a mod to the ticket mods list. - - @dev - Only the owner or operator of a project can make this call, or the current terminal of the project. - - @param _projectId The project to add a mod to. - @param _configuration The configuration to set the mods to be active during. - @param _mods The ticket mods to set. - */ - function setTicketMods( - uint256 _projectId, - uint256 _configuration, - TicketMod[] memory _mods - ) - external - override - requirePermissionAcceptingAlternateAddress( - projects.ownerOf(_projectId), - _projectId, - Operations.SetTicketMods, - address(terminalDirectory.terminalOf(_projectId)) - ) - { - // There must be something to do. - require(_mods.length > 0, "ModStore::setTicketMods: NO_OP"); - - // Get a reference to the project's ticket mods. - TicketMod[] memory _projectTicketMods = _ticketModsOf[_projectId][ - _configuration - ]; - - // Check to see if all locked Mods are included. - for (uint256 _i = 0; _i < _projectTicketMods.length; _i++) { - if (block.timestamp < _projectTicketMods[_i].lockedUntil) { - bool _includesLocked = false; - for (uint256 _j = 0; _j < _mods.length; _j++) { - // Check for the same values. - if ( - _mods[_j].percent == _projectTicketMods[_i].percent && - _mods[_j].beneficiary == - _projectTicketMods[_i].beneficiary && - // Allow lock extensions. - _mods[_j].lockedUntil >= - _projectTicketMods[_i].lockedUntil - ) _includesLocked = true; - } - require( - _includesLocked, - "ModStore::setTicketMods: SOME_LOCKED" - ); - } - } - // Delete from storage so mods can be repopulated. - delete _ticketModsOf[_projectId][_configuration]; - - // Add up all the percents to make sure they cumulative are under 100%. - uint256 _ticketModPercentTotal = 0; - - for (uint256 _i = 0; _i < _mods.length; _i++) { - // The percent should be greater than 0. - require( - _mods[_i].percent > 0, - "ModStore::setTicketMods: BAD_MOD_PERCENT" - ); - - // Add to the total percents. - _ticketModPercentTotal = _ticketModPercentTotal + _mods[_i].percent; - // The total percent should be less than 10000. - require( - _ticketModPercentTotal <= 10000, - "ModStore::setTicketMods: BAD_TOTAL_PERCENT" - ); - - // The beneficiary shouldn't be the zero address. - require( - _mods[_i].beneficiary != address(0), - "ModStore::setTicketMods: ZERO_ADDRESS" - ); - - // Push the new mod into the project's list of mods. - _ticketModsOf[_projectId][_configuration].push(_mods[_i]); - - emit SetTicketMod( - _projectId, - _configuration, - _mods[_i], - msg.sender - ); - } - } -} diff --git a/packages/hardhat/contracts/OperatorStore.sol b/packages/hardhat/contracts/OperatorStore.sol deleted file mode 100644 index d66b92c69b..0000000000 --- a/packages/hardhat/contracts/OperatorStore.sol +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/IOperatorStore.sol"; - -/** - @notice - Addresses can give permissions to any other address to take specific actions - throughout the Juicebox ecosystem on their behalf. These addresses are called `operators`. - - @dev - Permissions are stored as a uint256, with each boolean bit representing whether or not - an oporator has the permission identified by that bit's index in the 256 bit uint256. - Indexes must be between 0 and 255. - - The directory of permissions, along with how they uniquely mapp to indexes, are managed externally. - This contract doesn't know or care about specific permissions and their indexes. -*/ -contract OperatorStore is IOperatorStore { - // --- public stored properties --- // - - /** - @notice - The permissions that an operator has to operate on a specific domain. - - @dev - An account can give an operator permissions that only pertain to a specific domain. - There is no domain with an ID of 0 -- accounts can use the 0 domain to give an operator - permissions to operator on their personal behalf. - */ - mapping(address => mapping(address => mapping(uint256 => uint256))) - public - override permissionsOf; - - // --- public views --- // - - /** - @notice - Whether or not an operator has the permission to take a certain action pertaining to the specified domain. - - @param _operator The operator to check. - @param _account The account that has given out permission to the operator. - @param _domain The domain that the operator has been given permissions to operate. - @param _permissionIndex the permission to check for. - - @return Whether the operator has the specified permission. - */ - function hasPermission( - address _operator, - address _account, - uint256 _domain, - uint256 _permissionIndex - ) external view override returns (bool) { - require( - _permissionIndex <= 255, - "OperatorStore::hasPermission: INDEX_OUT_OF_BOUNDS" - ); - return - ((permissionsOf[_operator][_account][_domain] >> _permissionIndex) & - 1) == 1; - } - - /** - @notice - Whether or not an operator has the permission to take certain actions pertaining to the specified domain. - - @param _operator The operator to check. - @param _account The account that has given out permissions to the operator. - @param _domain The domain that the operator has been given permissions to operate. - @param _permissionIndexes An array of permission indexes to check for. - - @return Whether the operator has all specified permissions. - */ - function hasPermissions( - address _operator, - address _account, - uint256 _domain, - uint256[] calldata _permissionIndexes - ) external view override returns (bool) { - for (uint256 _i = 0; _i < _permissionIndexes.length; _i++) { - uint256 _permissionIndex = _permissionIndexes[_i]; - - require( - _permissionIndex <= 255, - "OperatorStore::hasPermissions: INDEX_OUT_OF_BOUNDS" - ); - - if ( - ((permissionsOf[_operator][_account][_domain] >> - _permissionIndex) & 1) == 0 - ) return false; - } - return true; - } - - // --- external transactions --- // - - /** - @notice - Sets permissions for an operator. - - @param _operator The operator to give permission to. - @param _domain The domain that the operator is being given permissions to operate. - @param _permissionIndexes An array of indexes of permissions to set. - */ - function setOperator( - address _operator, - uint256 _domain, - uint256[] calldata _permissionIndexes - ) external override { - // Pack the indexes into a uint256. - uint256 _packed = _packedPermissions(_permissionIndexes); - - // Store the new value. - permissionsOf[_operator][msg.sender][_domain] = _packed; - - emit SetOperator( - _operator, - msg.sender, - _domain, - _permissionIndexes, - _packed - ); - } - - /** - @notice - Sets permissions for many operators. - - @param _operators The operators to give permission to. - @param _domains The domains that can be operated. Set to 0 to allow operation of account level actions. - @param _permissionIndexes The level of power each operator should have. - */ - function setOperators( - address[] calldata _operators, - uint256[] calldata _domains, - uint256[][] calldata _permissionIndexes - ) external override { - // There should be a level for each operator provided. - require( - _operators.length == _permissionIndexes.length && - _operators.length == _domains.length, - "OperatorStore::setOperators: BAD_ARGS" - ); - for (uint256 _i = 0; _i < _operators.length; _i++) { - // Pack the indexes into a uint256. - uint256 _packed = _packedPermissions(_permissionIndexes[_i]); - // Store the new value. - permissionsOf[_operators[_i]][msg.sender][_domains[_i]] = _packed; - emit SetOperator( - _operators[_i], - msg.sender, - _domains[_i], - _permissionIndexes[_i], - _packed - ); - } - } - - // --- private helper functions --- // - - /** - @notice - Converts an array of permission indexes to a packed int. - - @param _indexes The indexes of the permissions to pack. - - @return packed The packed result. - */ - function _packedPermissions(uint256[] calldata _indexes) - private - pure - returns (uint256 packed) - { - for (uint256 _i = 0; _i < _indexes.length; _i++) { - uint256 _permissionIndex = _indexes[_i]; - require( - _permissionIndex <= 255, - "OperatorStore::_packedPermissions: INDEX_OUT_OF_BOUNDS" - ); - // Turn the bit at the index on. - packed |= 1 << _permissionIndex; - } - } -} diff --git a/packages/hardhat/contracts/Prices.sol b/packages/hardhat/contracts/Prices.sol deleted file mode 100644 index 08d07252c7..0000000000 --- a/packages/hardhat/contracts/Prices.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./interfaces/IPrices.sol"; - -/** - @notice Manage and normalizes ETH price feeds. -*/ -contract Prices is IPrices, Ownable { - // --- public constant stored properties --- // - - /// @notice The target number of decimals the price feed results have. - uint256 public constant override targetDecimals = 18; - - // --- public stored properties --- // - - /// @notice The number to multiply each price feed by to get to the target decimals. - mapping(uint256 => uint256) public override feedDecimalAdjuster; - - /// @notice The available price feeds that can be used to get the price of ETH. - mapping(uint256 => AggregatorV3Interface) public override feedFor; - - // --- external views --- // - - /** - @notice - Gets the current price of ETH for the provided currency. - - @param _currency The currency to get a price for. - - @return price The price of ETH with 18 decimals. - */ - function getETHPriceFor(uint256 _currency) - external - view - override - returns (uint256) - { - // The 0 currency is ETH itself. - if (_currency == 0) return 10**targetDecimals; - - // Get a reference to the feed. - AggregatorV3Interface _feed = feedFor[_currency]; - - // Feed must exist. - require( - _feed != AggregatorV3Interface(address(0)), - "Prices::getETHPrice: NOT_FOUND" - ); - - // Get the lateset round information. Only need the price is needed. - (, int256 _price, , , ) = _feed.latestRoundData(); - - // Multiply the price by the decimal adjuster to get the normalized result. - return uint256(_price) * feedDecimalAdjuster[_currency]; - } - - // --- external transactions --- // - - /** - @notice - Add a price feed for the price of ETH. - - @dev - Current feeds can't be modified. - - @param _feed The price feed being added. - @param _currency The currency that the price feed is for. - */ - function addFeed(AggregatorV3Interface _feed, uint256 _currency) - external - override - onlyOwner - { - // The 0 currency is reserved for ETH. - require(_currency > 0, "Prices::addFeed: RESERVED"); - - // There can't already be a feed for the specified currency. - require( - feedFor[_currency] == AggregatorV3Interface(address(0)), - "Prices::addFeed: ALREADY_EXISTS" - ); - - // Get a reference to the number of decimals the feed uses. - uint256 _decimals = _feed.decimals(); - - // Decimals should be less than or equal to the target number of decimals. - require(_decimals <= targetDecimals, "Prices::addFeed: BAD_DECIMALS"); - - // Set the feed. - feedFor[_currency] = _feed; - - // Set the decimal adjuster for the currency. - feedDecimalAdjuster[_currency] = 10**(targetDecimals - _decimals); - - emit AddFeed(_currency, _feed); - } -} diff --git a/packages/hardhat/contracts/Projects.sol b/packages/hardhat/contracts/Projects.sol deleted file mode 100644 index 710aa2e16a..0000000000 --- a/packages/hardhat/contracts/Projects.sol +++ /dev/null @@ -1,332 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -import "./abstract/Operatable.sol"; -import "./interfaces/IProjects.sol"; - -import "./libraries/Operations.sol"; - -/** - @notice - Stores project ownership and identifying information. - - @dev - Projects are represented as ERC-721's. -*/ -contract Projects is ERC721, IProjects, Operatable { - // --- private stored properties --- // - - // The number of seconds in a day. - uint256 private constant SECONDS_IN_YEAR = 31536000; - - // --- public stored properties --- // - - /// @notice A running count of project IDs. - uint256 public override count = 0; - - /// @notice Optional mapping for project URIs - mapping(uint256 => string) public override uriOf; - - /// @notice Each project's handle. - mapping(uint256 => bytes32) public override handleOf; - - /// @notice The project that each unique handle represents. - mapping(bytes32 => uint256) public override projectFor; - - /// @notice Handles that have been transfered to the specified address. - mapping(bytes32 => address) public override transferAddressFor; - - /// @notice The timestamps when each handle is claimable. A value of 0 means a handle isn't being challenged. - mapping(bytes32 => uint256) public override challengeExpiryOf; - - // --- external views --- // - - /** - @notice - Whether the specified project exists. - - @param _projectId The project to check the existence of. - - @return A flag indicating if the project exists. - */ - function exists(uint256 _projectId) external view override returns (bool) { - return _exists(_projectId); - } - - // --- external transactions --- // - - /** - @param _operatorStore A contract storing operator assignments. - */ - constructor(IOperatorStore _operatorStore) - ERC721("Juicebox project", "JUICEBOX PROJECT") - Operatable(_operatorStore) - {} - - /** - @notice - Create a new project. - - @dev - Anyone can create a project on an owner's behalf. - - @param _owner The owner of the project. - @param _handle A unique handle for the project. - @param _uri An ipfs CID to more info about the project. - @param _terminal The terminal to set for this project so that it can start receiving payments. - - @return The new project's ID. - */ - function create( - address _owner, - bytes32 _handle, - string calldata _uri, - ITerminal _terminal - ) external override returns (uint256) { - // Handle must exist. - require(_handle != bytes32(0), "Projects::create: EMPTY_HANDLE"); - - // Handle must be unique. - require( - projectFor[_handle] == 0 && - transferAddressFor[_handle] == address(0), - "Projects::create: HANDLE_TAKEN" - ); - - // Increment the count, which will be used as the ID. - count++; - - // Mint the project. - _safeMint(_owner, count); - - // Set the handle stored values. - handleOf[count] = _handle; - projectFor[_handle] = count; - - // Set the URI if one was provided. - if (bytes(_uri).length > 0) uriOf[count] = _uri; - - // Set the project's terminal if needed. - if (_terminal != ITerminal(address(0))) - _terminal.terminalDirectory().setTerminal(count, _terminal); - - emit Create(count, _owner, _handle, _uri, _terminal, msg.sender); - - return count; - } - - /** - @notice - Allows a project owner to set the project's handle. - - @dev - Only a project's owner or operator can set its handle. - - @param _projectId The ID of the project. - @param _handle The new unique handle for the project. - */ - function setHandle(uint256 _projectId, bytes32 _handle) - external - override - requirePermission(ownerOf(_projectId), _projectId, Operations.SetHandle) - { - // Handle must exist. - require(_handle != bytes32(0), "Projects::setHandle: EMPTY_HANDLE"); - - // Handle must be unique. - require( - projectFor[_handle] == 0 && - transferAddressFor[_handle] == address(0), - "Projects::setHandle: HANDLE_TAKEN" - ); - - // Register the change in the resolver. - projectFor[handleOf[_projectId]] = 0; - - projectFor[_handle] = _projectId; - handleOf[_projectId] = _handle; - - emit SetHandle(_projectId, _handle, msg.sender); - } - - /** - @notice - Allows a project owner to set the project's uri. - - @dev - Only a project's owner or operator can set its uri. - - @param _projectId The ID of the project. - @param _uri An ipfs CDN to more info about the project. Don't include the leading ipfs:// - */ - function setUri(uint256 _projectId, string calldata _uri) - external - override - requirePermission(ownerOf(_projectId), _projectId, Operations.SetUri) - { - // Set the new uri. - uriOf[_projectId] = _uri; - - emit SetUri(_projectId, _uri, msg.sender); - } - - /** - @notice - Allows a project owner to transfer its handle to another address. - - @dev - Only a project's owner or operator can transfer its handle. - - @param _projectId The ID of the project to transfer the handle from. - @param _to The address that can now reallocate the handle. - @param _newHandle The new unique handle for the project that will replace the transfered one. - */ - function transferHandle( - uint256 _projectId, - address _to, - bytes32 _newHandle - ) - external - override - requirePermission(ownerOf(_projectId), _projectId, Operations.SetHandle) - returns (bytes32 _handle) - { - require( - _newHandle != bytes32(0), - "Projects::transferHandle: EMPTY_HANDLE" - ); - - require( - projectFor[_newHandle] == 0 && - transferAddressFor[_handle] == address(0), - "Projects::transferHandle: HANDLE_TAKEN" - ); - - // Get a reference to the project's currency handle. - _handle = handleOf[_projectId]; - - // Remove the resolver for the transfered handle. - projectFor[_handle] = 0; - - // If the handle is changing, register the change in the resolver. - projectFor[_newHandle] = _projectId; - handleOf[_projectId] = _newHandle; - - // Transfer the current handle. - transferAddressFor[_handle] = _to; - - emit TransferHandle(_projectId, _to, _handle, _newHandle, msg.sender); - } - - /** - @notice - Allows an address to claim and handle that has been transfered to them and apply it to a project of theirs. - - @dev - Only a project's owner or operator can claim a handle onto it. - - @param _handle The handle being claimed. - @param _for The address that the handle has been transfered to. - @param _projectId The ID of the project to use the claimed handle. - */ - function claimHandle( - bytes32 _handle, - address _for, - uint256 _projectId - ) - external - override - requirePermissionAllowingWildcardDomain( - _for, - _projectId, - Operations.ClaimHandle - ) - requirePermission( - ownerOf(_projectId), - _projectId, - Operations.ClaimHandle - ) - { - // The handle must have been transfered to the specified address, - // or the handle challange must have expired before being renewed. - require( - transferAddressFor[_handle] == _for || - (challengeExpiryOf[_handle] > 0 && - block.timestamp > challengeExpiryOf[_handle]), - "Projects::claimHandle: UNAUTHORIZED" - ); - - // Register the change in the resolver. - projectFor[handleOf[_projectId]] = 0; - - // Register the change in the resolver. - projectFor[_handle] = _projectId; - - // Set the new handle. - handleOf[_projectId] = _handle; - - // Set the handle as not being transfered. - transferAddressFor[_handle] = address(0); - - // Reset the challenge to 0. - challengeExpiryOf[_handle] = 0; - - emit ClaimHandle(_for, _projectId, _handle, msg.sender); - } - - /** - @notice - Allows anyone to challenge a project's handle. After one year, the handle can be claimed by the public if the challenge isn't answered by the handle's project. - This can be used to make sure a handle belonging to an unattended to project isn't lost forever. - - @param _handle The handle to challenge. - */ - function challengeHandle(bytes32 _handle) external { - // No need to challenge a handle that's not taken. - require( - projectFor[_handle] > 0, - "Projects::challenge: HANDLE_NOT_TAKEN" - ); - - // No need to challenge again if a handle is already being challenged. - require( - challengeExpiryOf[_handle] == 0, - "Projects::challenge: HANDLE_ALREADY_BEING_CHALLENGED" - ); - - // The challenge will expire in a year, at which point the handle can be claimed if the challenge hasn't been answered. - uint256 _challengeExpiry = block.timestamp + SECONDS_IN_YEAR; - - challengeExpiryOf[_handle] = _challengeExpiry; - - emit ChallengeHandle(_handle, _challengeExpiry, msg.sender); - } - - /** - @notice - Allows a project to renew its handle so it can't be claimed until a year after its challenged again. - - @dev - Only a project's owner or operator can renew its handle. - - @param _projectId The ID of the project that current has the handle being renewed. - */ - function renewHandle(uint256 _projectId) - external - requirePermission( - ownerOf(_projectId), - _projectId, - Operations.RenewHandle - ) - { - // Get the handle of the project. - bytes32 _handle = handleOf[_projectId]; - - // Reset the challenge to 0. - challengeExpiryOf[_handle] = 0; - - emit RenewHandle(_handle, _projectId, msg.sender); - } -} diff --git a/packages/hardhat/contracts/ProxyPaymentAddress.sol b/packages/hardhat/contracts/ProxyPaymentAddress.sol deleted file mode 100644 index 8f51f6d69f..0000000000 --- a/packages/hardhat/contracts/ProxyPaymentAddress.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./interfaces/IProxyPaymentAddress.sol"; -import "./interfaces/ITerminalDirectory.sol"; -import "./interfaces/ITicketBooth.sol"; - -/** - @notice - A contract that can receive and hold funds for a given project. - Once funds are tapped, tickets are printed and can be transferred out of the contract at a later date. - - Particularly useful for routing funds from third-party platforms (e.g., Open Sea). -*/ -contract ProxyPaymentAddress is IProxyPaymentAddress, Ownable { - // --- public immutable stored properties --- // - - /// @notice The directory to use when resolving which terminal to send the payment to. - ITerminalDirectory public immutable override terminalDirectory; - - /// @notice The ticket booth to use when transferring tickets held by this contract to a beneficiary. - ITicketBooth public immutable override ticketBooth; - - /// @notice The ID of the project tickets should be redeemed for. - uint256 public immutable override projectId; - - /// @notice The memo to use when this contract forwards a payment to a terminal. - string public override memo; - - constructor( - ITerminalDirectory _terminalDirectory, - ITicketBooth _ticketBooth, - uint256 _projectId, - string memory _memo - ) { - terminalDirectory = _terminalDirectory; - ticketBooth = _ticketBooth; - projectId = _projectId; - memo = _memo; - } - - // Receive funds and hold them in the contract until they are ready to be transferred. - receive() external payable { - emit Receive( - msg.sender, - msg.value - ); - } - - // Transfers all funds held in the contract to the terminal of the corresponding project. - function tap() external override { - uint256 amount = address(this).balance; - - terminalDirectory.terminalOf(projectId).pay{value: amount}( - projectId, - /*_beneficiary=*/address(this), - memo, - /*_preferUnstakedTickets=*/false - ); - - emit Tap( - msg.sender, - amount - ); - } - - /** - @notice Transfers tickets held by this contract to a beneficiary. - @param _beneficiary Address of the beneficiary tickets will be transferred to. - */ - function transferTickets(address _beneficiary, uint256 _amount) external override onlyOwner { - ticketBooth.transfer( - address(this), - projectId, - _amount, - _beneficiary - ); - - emit TransferTickets( - msg.sender, - _beneficiary, - projectId, - _amount - ); - } - -} \ No newline at end of file diff --git a/packages/hardhat/contracts/ProxyPaymentAddressManager.sol b/packages/hardhat/contracts/ProxyPaymentAddressManager.sol deleted file mode 100644 index 28ff6c2492..0000000000 --- a/packages/hardhat/contracts/ProxyPaymentAddressManager.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITicketBooth.sol"; -import "./interfaces/ITerminalDirectory.sol"; -import "./interfaces/IProxyPaymentAddress.sol"; -import "./interfaces/IProxyPaymentAddressManager.sol"; - -import "./ProxyPaymentAddress.sol"; - -/** - @notice - Manages deploying proxy payment addresses for Juicebox projects. -*/ -contract ProxyPaymentAddressManager is IProxyPaymentAddressManager { - // --- private stored properties --- // - - // A mapping from project id to proxy payment addresses. - mapping(uint256 => IProxyPaymentAddress[]) private _addressesOf; - - // --- public immutable stored properties --- // - - /// @notice The directory that will be injected into proxy payment addresses. - ITerminalDirectory public immutable override terminalDirectory; - - /// @notice The ticket boot that will be injected into proxy payment addresses. - ITicketBooth public immutable override ticketBooth; - - constructor( - ITerminalDirectory _terminalDirectory, - ITicketBooth _ticketBooth - ) { - terminalDirectory = _terminalDirectory; - ticketBooth = _ticketBooth; - } - - /** - @notice - A list of all proxy payment addresses for the specified project ID. - - @param _projectId The ID of the project to get proxy payment addresses for. - - @return A list of proxy payment addresses for the specified project ID. - */ - function addressesOf(uint256 _projectId) - external - view - override - returns (IProxyPaymentAddress[] memory) - { - return _addressesOf[_projectId]; - } - - /** - @notice Deploys a proxy payment address. - @param _projectId ID of the project funds will be fowarded to. - @param _memo Memo that will be attached withdrawal transactions. - */ - function deploy(uint256 _projectId, string memory _memo) external override returns(address) { - require( - _projectId > 0, - "ProxyPaymentAddressManager::deploy: ZERO_PROJECT" - ); - - // Create the proxy payment address contract. - ProxyPaymentAddress proxyPaymentAddress = new ProxyPaymentAddress( - terminalDirectory, - ticketBooth, - _projectId, - _memo - ); - - // Transfer ownership to the caller of this tx. - proxyPaymentAddress.transferOwnership(msg.sender); - - // Push it to the list for the corresponding project. - _addressesOf[_projectId].push(proxyPaymentAddress); - - emit Deploy(_projectId, _memo, msg.sender); - - // Return the address of the proxy payment address. - return address(proxyPaymentAddress); - } - -} \ No newline at end of file diff --git a/packages/hardhat/contracts/TerminalDirectory.sol b/packages/hardhat/contracts/TerminalDirectory.sol deleted file mode 100644 index 34d02dac99..0000000000 --- a/packages/hardhat/contracts/TerminalDirectory.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITerminal.sol"; -import "./interfaces/ITerminalDirectory.sol"; -import "./interfaces/IProjects.sol"; - -import "./abstract/Operatable.sol"; - -import "./libraries/Operations.sol"; - -import "./DirectPaymentAddress.sol"; - -/** - @notice - Allows project owners to deploy proxy contracts that can pay them when receiving funds directly. -*/ -contract TerminalDirectory is ITerminalDirectory, Operatable { - // --- private stored properties --- // - - // A list of contracts for each project ID that can receive funds directly. - mapping(uint256 => IDirectPaymentAddress[]) private _addressesOf; - - // --- public immutable stored properties --- // - - /// @notice The Projects contract which mints ERC-721's that represent project ownership and transfers. - IProjects public immutable override projects; - - // --- public stored properties --- // - - /// @notice For each project ID, the juicebox terminal that the direct payment addresses are proxies for. - mapping(uint256 => ITerminal) public override terminalOf; - - /// @notice For each address, the address that will be used as the beneficiary of direct payments made. - mapping(address => address) public override beneficiaryOf; - - /// @notice For each address, the preference of whether ticket will be auto claimed as ERC20s when a payment is made. - mapping(address => bool) public override unstakedTicketsPreferenceOf; - - // --- external views --- // - - /** - @notice - A list of all direct payment addresses for the specified project ID. - - @param _projectId The ID of the project to get direct payment addresses for. - - @return A list of direct payment addresses for the specified project ID. - */ - function addressesOf(uint256 _projectId) - external - view - override - returns (IDirectPaymentAddress[] memory) - { - return _addressesOf[_projectId]; - } - - // --- external transactions --- // - - /** - @param _projects A Projects contract which mints ERC-721's that represent project ownership and transfers. - @param _operatorStore A contract storing operator assignments. - */ - constructor(IProjects _projects, IOperatorStore _operatorStore) - Operatable(_operatorStore) - { - projects = _projects; - } - - /** - @notice - Allows anyone to deploy a new direct payment address for a project. - - @param _projectId The ID of the project to deploy a direct payment address for. - @param _memo The note to use for payments made through the new direct payment address. - */ - function deployAddress(uint256 _projectId, string calldata _memo) - external - override - { - require( - _projectId > 0, - "TerminalDirectory::deployAddress: ZERO_PROJECT" - ); - - // Deploy the contract and push it to the list. - _addressesOf[_projectId].push( - new DirectPaymentAddress(this, _projectId, _memo) - ); - - emit DeployAddress(_projectId, _memo, msg.sender); - } - - /** - @notice - Update the juicebox terminal that payments to direct payment addresses will be forwarded for the specified project ID. - - @param _projectId The ID of the project to set a new terminal for. - @param _terminal The new terminal to set. - */ - function setTerminal(uint256 _projectId, ITerminal _terminal) - external - override - { - // Get a reference to the current terminal being used. - ITerminal _currentTerminal = terminalOf[_projectId]; - - address _projectOwner = projects.ownerOf(_projectId); - - // Either: - // - case 1: the current terminal hasn't been set yet and the msg sender is either the projects contract or the terminal being set. - // - case 2: the current terminal must not yet be set, or the current terminal is setting a new terminal. - // - case 3: the msg sender is the owner or operator and either the current terminal hasn't been set, or the current terminal allows migration to the terminal being set. - require( - // case 1. - (_currentTerminal == ITerminal(address(0)) && - (msg.sender == address(projects) || - msg.sender == address(_terminal))) || - // case 2. - msg.sender == address(_currentTerminal) || - // case 3. - ((msg.sender == _projectOwner || - operatorStore.hasPermission( - msg.sender, - _projectOwner, - _projectId, - Operations.SetTerminal - )) && - (_currentTerminal == ITerminal(address(0)) || - _currentTerminal.migrationIsAllowed(_terminal))), - "TerminalDirectory::setTerminal: UNAUTHORIZED" - ); - - // The project must exist. - require( - projects.exists(_projectId), - "TerminalDirectory::setTerminal: NOT_FOUND" - ); - - // Can't set the zero address. - require( - _terminal != ITerminal(address(0)), - "TerminalDirectory::setTerminal: ZERO_ADDRESS" - ); - - // If the terminal is already set, nothing to do. - if (_currentTerminal == _terminal) return; - - // Set the new terminal. - terminalOf[_projectId] = _terminal; - - emit SetTerminal(_projectId, _terminal, msg.sender); - } - - /** - @notice - Allows any address to pre set the beneficiary of their payments to any direct payment address, - and to pre set whether to prefer to unstake tickets into ERC20's when making a payment. - - @param _beneficiary The beneficiary to set. - @param _preferUnstakedTickets The preference to set. - */ - function setPayerPreferences( - address _beneficiary, - bool _preferUnstakedTickets - ) external override { - beneficiaryOf[msg.sender] = _beneficiary; - unstakedTicketsPreferenceOf[msg.sender] = _preferUnstakedTickets; - - emit SetPayerPreferences( - msg.sender, - _beneficiary, - _preferUnstakedTickets - ); - } -} diff --git a/packages/hardhat/contracts/TerminalV1.sol b/packages/hardhat/contracts/TerminalV1.sol deleted file mode 100644 index 92ddd82746..0000000000 --- a/packages/hardhat/contracts/TerminalV1.sol +++ /dev/null @@ -1,1405 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "@paulrberg/contracts/math/PRBMath.sol"; -import "@paulrberg/contracts/math/PRBMathUD60x18.sol"; - -import "./interfaces/ITerminalV1.sol"; -import "./abstract/JuiceboxProject.sol"; -import "./abstract/Operatable.sol"; - -import "./libraries/Operations.sol"; - -/** - ───────────────────────────────────────────────────────────────────────────────────────────────── - ─────────██████──███████──██████──██████████──██████████████──██████████████──████████████████─── - ─────────██░░██──███░░██──██░░██──██░░░░░░██──██░░░░░░░░░░██──██░░░░░░░░░░██──██░░░░░░░░░░░░██─── - ─────────██░░██──███░░██──██░░██──████░░████──██░░██████████──██░░██████████──██░░████████░░██─── - ─────────██░░██──███░░██──██░░██────██░░██────██░░██──────────██░░██──────────██░░██────██░░██─── - ─────────██░░██──███░░██──██░░██────██░░██────██░░██──────────██░░██████████──██░░████████░░██─── - ─────────██░░██──███░░██──██░░██────██░░██────██░░██──────────██░░░░░░░░░░██──██░░░░░░░░░░░░██─── - ─██████──██░░██──███░░██──██░░██────██░░██────██░░██──────────██░░██████████──██░░██████░░████─── - ─██░░██──██░░██──███░░██──██░░██────██░░██────██░░██──────────██░░██──────────██░░██──██░░██───── - ─██░░██████░░██──███░░██████░░██──████░░████──██░░██████████──██░░██████████──██░░██──██░░██████─ - ─██░░░░░░░░░░██──███░░░░░░░░░░██──██░░░░░░██──██░░░░░░░░░░██──██░░░░░░░░░░██──██░░██──██░░░░░░██─ - ─██████████████──███████████████──██████████──██████████████──██████████████──██████──██████████─ - ─────────────────────────────────────────────────────────────────────────────────────────── - - @notice - This contract manages the Juicebox ecosystem, serves as a payment terminal, and custodies all funds. - - @dev - A project can transfer its funds, along with the power to reconfigure and mint/burn their Tickets, from this contract to another allowed terminal contract at any time. -*/ -contract TerminalV1 is Operatable, ITerminalV1, ITerminal, ReentrancyGuard { - // Modifier to only allow governance to call the function. - modifier onlyGov() { - require(msg.sender == governance, "TerminalV1: UNAUTHORIZED"); - _; - } - - // --- private stored properties --- // - - // The difference between the processed ticket tracker of a project and the project's ticket's total supply is the amount of tickets that - // still need to have reserves printed against them. - mapping(uint256 => int256) private _processedTicketTrackerOf; - - // The amount of ticket printed prior to a project configuring their first funding cycle. - mapping(uint256 => uint256) private _preconfigureTicketCountOf; - - // --- public immutable stored properties --- // - - /// @notice The Projects contract which mints ERC-721's that represent project ownership and transfers. - IProjects public immutable override projects; - - /// @notice The contract storing all funding cycle configurations. - IFundingCycles public immutable override fundingCycles; - - /// @notice The contract that manages Ticket printing and redeeming. - ITicketBooth public immutable override ticketBooth; - - /// @notice The contract that stores mods for each project. - IModStore public immutable override modStore; - - /// @notice The prices feeds. - IPrices public immutable override prices; - - /// @notice The directory of terminals. - ITerminalDirectory public immutable override terminalDirectory; - - // --- public stored properties --- // - - /// @notice The amount of ETH that each project is responsible for. - mapping(uint256 => uint256) public override balanceOf; - - /// @notice The percent fee the Juicebox project takes from tapped amounts. Out of 200. - uint256 public override fee = 10; - - /// @notice The governance of the contract who makes fees and can allow new TerminalV1 contracts to be migrated to by project owners. - address payable public override governance; - - /// @notice The governance of the contract who makes fees and can allow new TerminalV1 contracts to be migrated to by project owners. - address payable public override pendingGovernance; - - // Whether or not a particular contract is available for projects to migrate their funds and Tickets to. - mapping(ITerminal => bool) public override migrationIsAllowed; - - // --- external views --- // - - /** - @notice - Gets the current overflowed amount for a specified project. - - @param _projectId The ID of the project to get overflow for. - - @return overflow The current overflow of funds for the project. - */ - function currentOverflowOf(uint256 _projectId) - external - view - override - returns (uint256 overflow) - { - // Get a reference to the project's current funding cycle. - FundingCycle memory _fundingCycle = fundingCycles.currentOf(_projectId); - - // There's no overflow if there's no funding cycle. - if (_fundingCycle.id == 0) return 0; - - return _overflowFrom(_fundingCycle); - } - - /** - @notice - Gets the amount of reserved tickets that a project has. - - @param _projectId The ID of the project to get overflow for. - @param _reservedRate The reserved rate to use to make the calculation. - - @return amount overflow The current overflow of funds for the project. - */ - function reservedTicketBalanceOf(uint256 _projectId, uint256 _reservedRate) - external - view - override - returns (uint256) - { - return - _reservedTicketAmountFrom( - _processedTicketTrackerOf[_projectId], - _reservedRate, - ticketBooth.totalSupplyOf(_projectId) - ); - } - - // --- public views --- // - - /** - @notice - The amount of tokens that can be claimed by the given address. - - @dev The _account must have at least _count tickets for the specified project. - @dev If there is a funding cycle reconfiguration ballot open for the project, the project's current bonding curve is bypassed. - - @param _account The address to get an amount for. - @param _projectId The ID of the project to get a claimable amount for. - @param _count The number of Tickets that would be redeemed to get the resulting amount. - - @return amount The amount of tokens that can be claimed. - */ - function claimableOverflowOf( - address _account, - uint256 _projectId, - uint256 _count - ) public view override returns (uint256) { - // The holder must have the specified number of the project's tickets. - require( - ticketBooth.balanceOf(_account, _projectId) >= _count, - "TerminalV1::claimableOverflow: INSUFFICIENT_TICKETS" - ); - - // Get a reference to the current funding cycle for the project. - FundingCycle memory _fundingCycle = fundingCycles.currentOf(_projectId); - - // There's no overflow if there's no funding cycle. - if (_fundingCycle.id == 0) return 0; - - // Get the amount of current overflow. - uint256 _currentOverflow = _overflowFrom(_fundingCycle); - - // If there is no overflow, nothing is claimable. - if (_currentOverflow == 0) return 0; - - // Get the total number of tickets in circulation. - uint256 _totalSupply = ticketBooth.totalSupplyOf(_projectId); - - // Get the number of reserved tickets the project has. - // The reserved rate is in bits 8-15 of the metadata. - uint256 _reservedTicketAmount = _reservedTicketAmountFrom( - _processedTicketTrackerOf[_projectId], - uint256(uint8(_fundingCycle.metadata >> 8)), - _totalSupply - ); - - // If there are reserved tickets, add them to the total supply. - if (_reservedTicketAmount > 0) - _totalSupply = _totalSupply + _reservedTicketAmount; - - // If the amount being redeemed is the the total supply, return the rest of the overflow. - if (_count == _totalSupply) return _currentOverflow; - - // Get a reference to the linear proportion. - uint256 _base = PRBMath.mulDiv(_currentOverflow, _count, _totalSupply); - - // Use the reconfiguration bonding curve if the queued cycle is pending approval according to the previous funding cycle's ballot. - uint256 _bondingCurveRate = fundingCycles.currentBallotStateOf( - _projectId - ) == BallotState.Active // The reconfiguration bonding curve rate is stored in bytes 24-31 of the metadata property. - ? uint256(uint8(_fundingCycle.metadata >> 24)) // The bonding curve rate is stored in bytes 16-23 of the data property after. - : uint256(uint8(_fundingCycle.metadata >> 16)); - - // The bonding curve formula. - // https://www.desmos.com/calculator/sp9ru6zbpk - // where x is _count, o is _currentOverflow, s is _totalSupply, and r is _bondingCurveRate. - - // These conditions are all part of the same curve. Edge conditions are separated because fewer operation are necessary. - if (_bondingCurveRate == 200) return _base; - if (_bondingCurveRate == 0) - return PRBMath.mulDiv(_base, _count, _totalSupply); - return - PRBMath.mulDiv( - _base, - _bondingCurveRate + - PRBMath.mulDiv( - _count, - 200 - _bondingCurveRate, - _totalSupply - ), - 200 - ); - } - - /** - @notice - Whether or not a project can still print premined tickets. - - @param _projectId The ID of the project to get the status of. - - @return Boolean flag. - */ - function canPrintPreminedTickets(uint256 _projectId) - public - view - override - returns (bool) - { - return - // The total supply of tickets must equal the preconfigured ticket count. - ticketBooth.totalSupplyOf(_projectId) == - _preconfigureTicketCountOf[_projectId] && - // The above condition is still possible after post-configured tickets have been printed due to ticket redeeming. - // The only case when processedTicketTracker is 0 is before redeeming and printing reserved tickets. - _processedTicketTrackerOf[_projectId] >= 0 && - uint256(_processedTicketTrackerOf[_projectId]) == - _preconfigureTicketCountOf[_projectId]; - } - - // --- external transactions --- // - - /** - @param _projects A Projects contract which mints ERC-721's that represent project ownership and transfers. - @param _fundingCycles A funding cycle configuration store. - @param _ticketBooth A contract that manages Ticket printing and redeeming. - @param _operatorStore A contract storing operator assignments. - @param _modStore A storage for a project's mods. - @param _prices A price feed contract to use. - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor( - IProjects _projects, - IFundingCycles _fundingCycles, - ITicketBooth _ticketBooth, - IOperatorStore _operatorStore, - IModStore _modStore, - IPrices _prices, - ITerminalDirectory _terminalDirectory, - address payable _governance - ) Operatable(_operatorStore) { - require( - _projects != IProjects(address(0)) && - _fundingCycles != IFundingCycles(address(0)) && - _ticketBooth != ITicketBooth(address(0)) && - _modStore != IModStore(address(0)) && - _prices != IPrices(address(0)) && - _terminalDirectory != ITerminalDirectory(address(0)) && - _governance != address(address(0)), - "TerminalV1: ZERO_ADDRESS" - ); - projects = _projects; - fundingCycles = _fundingCycles; - ticketBooth = _ticketBooth; - modStore = _modStore; - prices = _prices; - terminalDirectory = _terminalDirectory; - governance = _governance; - } - - /** - @notice - Deploys a project. This will mint an ERC-721 into the `_owner`'s account, configure a first funding cycle, and set up any mods. - - @dev - Each operation withing this transaction can be done in sequence separately. - - @dev - Anyone can deploy a project on an owner's behalf. - - @param _owner The address that will own the project. - @param _handle The project's unique handle. - @param _uri A link to information about the project and this funding cycle. - @param _properties The funding cycle configuration. - @dev _properties.target The amount that the project wants to receive in this funding cycle. Sent as a wad. - @dev _properties.currency The currency of the `target`. Send 0 for ETH or 1 for USD. - @dev _properties.duration The duration of the funding stage for which the `target` amount is needed. Measured in days. Send 0 for a boundless cycle reconfigurable at any time. - @dev _properties.cycleLimit The number of cycles that this configuration should last for before going back to the last permanent. This has no effect for a project's first funding cycle. - @dev _properties.discountRate A number from 0-200 indicating how valuable a contribution to this funding stage is compared to the project's previous funding stage. - If it's 200, each funding stage will have equal weight. - If the number is 180, a contribution to the next funding stage will only give you 90% of tickets given to a contribution of the same amount during the current funding stage. - If the number is 0, an non-recurring funding stage will get made. - @dev _properties.ballot The new ballot that will be used to approve subsequent reconfigurations. - @param _metadata A struct specifying the TerminalV1 specific params _bondingCurveRate, and _reservedRate. - @dev _metadata.reservedRate A number from 0-200 indicating the percentage of each contribution's tickets that will be reserved for the project owner. - @dev _metadata.bondingCurveRate The rate from 0-200 at which a project's Tickets can be redeemed for surplus. - The bonding curve formula is https://www.desmos.com/calculator/sp9ru6zbpk - where x is _count, o is _currentOverflow, s is _totalSupply, and r is _bondingCurveRate. - @dev _metadata.reconfigurationBondingCurveRate The bonding curve rate to apply when there is an active ballot. - @param _payoutMods Any payout mods to set. - @param _ticketMods Any ticket mods to set. - */ - function deploy( - address _owner, - bytes32 _handle, - string calldata _uri, - FundingCycleProperties calldata _properties, - FundingCycleMetadata calldata _metadata, - PayoutMod[] memory _payoutMods, - TicketMod[] memory _ticketMods - ) external override { - // Make sure the metadata checks out. If it does, return a packed version of it. - uint256 _packedMetadata = _validateAndPackFundingCycleMetadata( - _metadata - ); - - // Create the project for the owner. - uint256 _projectId = projects.create(_owner, _handle, _uri, this); - - // Configure the funding stage's state. - FundingCycle memory _fundingCycle = fundingCycles.configure( - _projectId, - _properties, - _packedMetadata, - fee, - true - ); - - // Set payout mods if there are any. - if (_payoutMods.length > 0) - modStore.setPayoutMods( - _projectId, - _fundingCycle.configured, - _payoutMods - ); - - // Set ticket mods if there are any. - if (_ticketMods.length > 0) - modStore.setTicketMods( - _projectId, - _fundingCycle.configured, - _ticketMods - ); - } - - /** - @notice - Configures the properties of the current funding cycle if the project hasn't distributed tickets yet, or - sets the properties of the proposed funding cycle that will take effect once the current one expires - if it is approved by the current funding cycle's ballot. - - @dev - Only a project's owner or a designated operator can configure its funding cycles. - - @param _projectId The ID of the project being reconfigured. - @param _properties The funding cycle configuration. - @dev _properties.target The amount that the project wants to receive in this funding stage. Sent as a wad. - @dev _properties.currency The currency of the `target`. Send 0 for ETH or 1 for USD. - @dev _properties.duration The duration of the funding stage for which the `target` amount is needed. Measured in days. Send 0 for a boundless cycle reconfigurable at any time. - @dev _properties.cycleLimit The number of cycles that this configuration should last for before going back to the last permanent. This has no effect for a project's first funding cycle. - @dev _properties.discountRate A number from 0-200 indicating how valuable a contribution to this funding stage is compared to the project's previous funding stage. - If it's 200, each funding stage will have equal weight. - If the number is 180, a contribution to the next funding stage will only give you 90% of tickets given to a contribution of the same amount during the current funding stage. - If the number is 0, an non-recurring funding stage will get made. - @dev _properties.ballot The new ballot that will be used to approve subsequent reconfigurations. - @param _metadata A struct specifying the TerminalV1 specific params _bondingCurveRate, and _reservedRate. - @dev _metadata.reservedRate A number from 0-200 indicating the percentage of each contribution's tickets that will be reserved for the project owner. - @dev _metadata.bondingCurveRate The rate from 0-200 at which a project's Tickets can be redeemed for surplus. - The bonding curve formula is https://www.desmos.com/calculator/sp9ru6zbpk - where x is _count, o is _currentOverflow, s is _totalSupply, and r is _bondingCurveRate. - @dev _metadata.reconfigurationBondingCurveRate The bonding curve rate to apply when there is an active ballot. - - @return The ID of the funding cycle that was successfully configured. - */ - function configure( - uint256 _projectId, - FundingCycleProperties calldata _properties, - FundingCycleMetadata calldata _metadata, - PayoutMod[] memory _payoutMods, - TicketMod[] memory _ticketMods - ) - external - override - requirePermission( - projects.ownerOf(_projectId), - _projectId, - Operations.Configure - ) - returns (uint256) - { - // Make sure the metadata is validated, and pack it into a uint256. - uint256 _packedMetadata = _validateAndPackFundingCycleMetadata( - _metadata - ); - - // If the project can still print premined tickets configure the active funding cycle instead of creating a standby one. - bool _shouldConfigureActive = canPrintPreminedTickets(_projectId); - - // Configure the funding stage's state. - FundingCycle memory _fundingCycle = fundingCycles.configure( - _projectId, - _properties, - _packedMetadata, - fee, - _shouldConfigureActive - ); - - // Set payout mods for the new configuration if there are any. - if (_payoutMods.length > 0) - modStore.setPayoutMods( - _projectId, - _fundingCycle.configured, - _payoutMods - ); - - // Set payout mods for the new configuration if there are any. - if (_ticketMods.length > 0) - modStore.setTicketMods( - _projectId, - _fundingCycle.configured, - _ticketMods - ); - - return _fundingCycle.id; - } - - /** - @notice - Allows a project to print tickets for a specified beneficiary before payments have been received. - - @dev - This can only be done if the project hasn't yet received a payment after configuring a funding cycle. - - @dev - Only a project's owner or a designated operator can print premined tickets. - - @param _projectId The ID of the project to premine tickets for. - @param _amount The amount to base the ticket premine off of. - @param _currency The currency of the amount to base the ticket premine off of. - @param _beneficiary The address to send the printed tickets to. - @param _memo A memo to leave with the printing. - @param _preferUnstakedTickets If there is a preference to unstake the printed tickets. - */ - function printPreminedTickets( - uint256 _projectId, - uint256 _amount, - uint256 _currency, - address _beneficiary, - string memory _memo, - bool _preferUnstakedTickets - ) - external - override - requirePermission( - projects.ownerOf(_projectId), - _projectId, - Operations.PrintPreminedTickets - ) - { - // Can't send to the zero address. - require( - _beneficiary != address(0), - "TerminalV1::printTickets: ZERO_ADDRESS" - ); - - // Get the current funding cycle to read the weight and currency from. - uint256 _weight = fundingCycles.BASE_WEIGHT(); - - // Get the current funding cycle to read the weight and currency from. - // Get the currency price of ETH. - uint256 _ethPrice = prices.getETHPriceFor(_currency); - - // Multiply the amount by the funding cycle's weight to determine the amount of tickets to print. - uint256 _weightedAmount = PRBMathUD60x18.mul( - PRBMathUD60x18.div(_amount, _ethPrice), - _weight - ); - - // Make sure the project hasnt printed tickets that werent preconfigure. - // Do this check after the external calls above. - require( - canPrintPreminedTickets(_projectId), - "TerminalV1::printTickets: ALREADY_ACTIVE" - ); - - // Set the preconfigure tickets as processed so that reserved tickets cant be minted against them. - // Make sure int casting isnt overflowing the int. 2^255 - 1 is the largest number that can be stored in an int. - require( - _processedTicketTrackerOf[_projectId] < 0 || - uint256(_processedTicketTrackerOf[_projectId]) + - uint256(_weightedAmount) <= - uint256(type(int256).max), - "TerminalV1::printTickets: INT_LIMIT_REACHED" - ); - - _processedTicketTrackerOf[_projectId] = - _processedTicketTrackerOf[_projectId] + - int256(_weightedAmount); - - // Set the count of preconfigure tickets this project has printed. - _preconfigureTicketCountOf[_projectId] = - _preconfigureTicketCountOf[_projectId] + - _weightedAmount; - - // Print the project's tickets for the beneficiary. - ticketBooth.print( - _beneficiary, - _projectId, - _weightedAmount, - _preferUnstakedTickets - ); - - emit PrintPreminedTickets( - _projectId, - _beneficiary, - _amount, - _currency, - _memo, - msg.sender - ); - } - - /** - @notice - Contribute ETH to a project. - - @dev - Print's the project's tickets proportional to the amount of the contribution. - - @dev - The msg.value is the amount of the contribution in wei. - - @param _projectId The ID of the project being contribute to. - @param _beneficiary The address to print Tickets for. - @param _memo A memo that will be included in the published event. - @param _preferUnstakedTickets Whether ERC20's should be unstaked automatically if they have been issued. - - @return The ID of the funding cycle that the payment was made during. - */ - function pay( - uint256 _projectId, - address _beneficiary, - string calldata _memo, - bool _preferUnstakedTickets - ) external payable override returns (uint256) { - // Positive payments only. - require(msg.value > 0, "TerminalV1::pay: BAD_AMOUNT"); - - // Cant send tickets to the zero address. - require(_beneficiary != address(0), "TerminalV1::pay: ZERO_ADDRESS"); - - return - _pay( - _projectId, - msg.value, - _beneficiary, - _memo, - _preferUnstakedTickets - ); - } - - /** - @notice - Tap into funds that have been contributed to a project's current funding cycle. - - @dev - Anyone can tap funds on a project's behalf. - - @param _projectId The ID of the project to which the funding cycle being tapped belongs. - @param _amount The amount being tapped, in the funding cycle's currency. - @param _currency The expected currency being tapped. - @param _minReturnedWei The minimum number of wei that the amount should be valued at. - - @return The ID of the funding cycle that was tapped. - */ - function tap( - uint256 _projectId, - uint256 _amount, - uint256 _currency, - uint256 _minReturnedWei - ) external override nonReentrant returns (uint256) { - // Register the funds as tapped. Get the ID of the funding cycle that was tapped. - FundingCycle memory _fundingCycle = fundingCycles.tap( - _projectId, - _amount - ); - - // If there's no funding cycle, there are no funds to tap. - if (_fundingCycle.id == 0) return 0; - - // Make sure the currency's match. - require( - _currency == _fundingCycle.currency, - "TerminalV1::tap: UNEXPECTED_CURRENCY" - ); - - // Get a reference to this project's current balance, including any earned yield. - // Get the currency price of ETH. - uint256 _ethPrice = prices.getETHPriceFor(_fundingCycle.currency); - - // Get the price of ETH. - // The amount of ETH that is being tapped. - uint256 _tappedWeiAmount = PRBMathUD60x18.div(_amount, _ethPrice); - - // The amount being tapped must be at least as much as was expected. - require( - _minReturnedWei <= _tappedWeiAmount, - "TerminalV1::tap: INADEQUATE" - ); - - // Get a reference to this project's current balance, including any earned yield. - uint256 _balance = balanceOf[_fundingCycle.projectId]; - - // The amount being tapped must be available. - require( - _tappedWeiAmount <= _balance, - "TerminalV1::tap: INSUFFICIENT_FUNDS" - ); - - // Removed the tapped funds from the project's balance. - balanceOf[_projectId] = _balance - _tappedWeiAmount; - - // Get a reference to the project owner, which will receive the admin's tickets from paying the fee, - // and receive any extra tapped funds not allocated to mods. - address payable _projectOwner = payable( - projects.ownerOf(_fundingCycle.projectId) - ); - - // Get a reference to the handle of the project paying the fee and sending payouts. - bytes32 _handle = projects.handleOf(_projectId); - - // Take a fee from the _tappedWeiAmount, if needed. - // The project's owner will be the beneficiary of the resulting printed tickets from the governance project. - uint256 _feeAmount = _fundingCycle.fee > 0 - ? _takeFee( - _tappedWeiAmount, - _fundingCycle.fee, - _projectOwner, - string(bytes.concat("Fee from @", _handle)) - ) - : 0; - - // Payout to mods and get a reference to the leftover transfer amount after all mods have been paid. - // The net transfer amount is the tapped amount minus the fee. - uint256 _leftoverTransferAmount = _distributeToPayoutMods( - _fundingCycle, - _tappedWeiAmount - _feeAmount, - string(bytes.concat("Payout from @", _handle)) - ); - - // Transfer any remaining balance to the beneficiary. - if (_leftoverTransferAmount > 0) - Address.sendValue(_projectOwner, _leftoverTransferAmount); - - emit Tap( - _fundingCycle.id, - _fundingCycle.projectId, - _projectOwner, - _amount, - _fundingCycle.currency, - _tappedWeiAmount - _feeAmount, - _leftoverTransferAmount, - _feeAmount, - msg.sender - ); - - return _fundingCycle.id; - } - - /** - @notice - Addresses can redeem their Tickets to claim the project's overflowed ETH. - - @dev - Only a ticket's holder or a designated operator can redeem it. - - @param _account The account to redeem tickets for. - @param _projectId The ID of the project to which the Tickets being redeemed belong. - @param _count The number of Tickets to redeem. - @param _minReturnedWei The minimum amount of Wei expected in return. - @param _beneficiary The address to send the ETH to. - @param _preferUnstaked If the preference is to redeem tickets that have been converted to ERC-20s. - - @return amount The amount of ETH that the tickets were redeemed for. - */ - function redeem( - address _account, - uint256 _projectId, - uint256 _count, - uint256 _minReturnedWei, - address payable _beneficiary, - bool _preferUnstaked - ) - external - override - nonReentrant - requirePermissionAllowingWildcardDomain( - _account, - _projectId, - Operations.Redeem - ) - returns (uint256 amount) - { - // There must be an amount specified to redeem. - require(_count > 0, "TerminalV1::redeem: NO_OP"); - - // Can't send claimed funds to the zero address. - require(_beneficiary != address(0), "TerminalV1::redeem: ZERO_ADDRESS"); - - // The amount of ETH claimable by the message sender from the specified project by redeeming the specified number of tickets. - amount = claimableOverflowOf(_account, _projectId, _count); - - // Nothing to do if the amount is 0. - require(amount > 0, "TerminalV1::redeem: NO_OP"); - - // The amount being claimed must be at least as much as was expected. - require(amount >= _minReturnedWei, "TerminalV1::redeem: INADEQUATE"); - - // Remove the redeemed funds from the project's balance. - balanceOf[_projectId] = balanceOf[_projectId] - amount; - - // Get a reference to the processed ticket tracker for the project. - int256 _processedTicketTracker = _processedTicketTrackerOf[_projectId]; - - // Subtract the count from the processed ticket tracker. - // Subtract from processed tickets so that the difference between whats been processed and the - // total supply remains the same. - // If there are at least as many processed tickets as there are tickets being redeemed, - // the processed ticket tracker of the project will be positive. Otherwise it will be negative. - _processedTicketTrackerOf[_projectId] = _processedTicketTracker < 0 // If the tracker is negative, add the count and reverse it. - ? -int256(uint256(-_processedTicketTracker) + _count) // the tracker is less than the count, subtract it from the count and reverse it. - : _processedTicketTracker < int256(_count) - ? -(int256(_count) - _processedTicketTracker) // simply subtract otherwise. - : _processedTicketTracker - int256(_count); - - // Redeem the tickets, which burns them. - ticketBooth.redeem(_account, _projectId, _count, _preferUnstaked); - - // Transfer funds to the specified address. - Address.sendValue(_beneficiary, amount); - - emit Redeem( - _account, - _beneficiary, - _projectId, - _count, - amount, - msg.sender - ); - } - - /** - @notice - Allows a project owner to migrate its funds and operations to a new contract. - - @dev - Only a project's owner or a designated operator can migrate it. - - @param _projectId The ID of the project being migrated. - @param _to The contract that will gain the project's funds. - */ - function migrate(uint256 _projectId, ITerminal _to) - external - override - requirePermission( - projects.ownerOf(_projectId), - _projectId, - Operations.Migrate - ) - nonReentrant - { - // This TerminalV1 must be the project's current terminal. - require( - terminalDirectory.terminalOf(_projectId) == this, - "TerminalV1::migrate: UNAUTHORIZED" - ); - - // The migration destination must be allowed. - require(migrationIsAllowed[_to], "TerminalV1::migrate: NOT_ALLOWED"); - - // All reserved tickets must be printed before migrating. - if ( - uint256(_processedTicketTrackerOf[_projectId]) != - ticketBooth.totalSupplyOf(_projectId) - ) printReservedTickets(_projectId); - - // Get a reference to this project's current balance, included any earned yield. - uint256 _balanceOf = balanceOf[_projectId]; - - // Set the balance to 0. - balanceOf[_projectId] = 0; - - // Move the funds to the new contract if needed. - if (_balanceOf > 0) _to.addToBalance{value: _balanceOf}(_projectId); - - // Switch the direct payment terminal. - terminalDirectory.setTerminal(_projectId, _to); - - emit Migrate(_projectId, _to, _balanceOf, msg.sender); - } - - /** - @notice - Receives and allocates funds belonging to the specified project. - - @param _projectId The ID of the project to which the funds received belong. - */ - function addToBalance(uint256 _projectId) external payable override { - // The amount must be positive. - require(msg.value > 0, "TerminalV1::addToBalance: BAD_AMOUNT"); - balanceOf[_projectId] = balanceOf[_projectId] + msg.value; - emit AddToBalance(_projectId, msg.value, msg.sender); - } - - /** - @notice - Adds to the contract addresses that projects can migrate their Tickets to. - - @dev - Only governance can add a contract to the migration allow list. - - @param _contract The contract to allow. - */ - function allowMigration(ITerminal _contract) external override onlyGov { - // Can't allow the zero address. - require( - _contract != ITerminal(address(0)), - "TerminalV1::allowMigration: ZERO_ADDRESS" - ); - - // Can't migrate to this same contract - require(_contract != this, "TerminalV1::allowMigration: NO_OP"); - - // Set the contract as allowed - migrationIsAllowed[_contract] = true; - - emit AllowMigration(_contract); - } - - /** - @notice - Allow the admin to change the fee. - - @dev - Only funding cycle reconfigurations after the new fee is set will use the new fee. - All future funding cycles based on configurations made in the past will use the fee that was set at the time of the configuration. - - @dev - Only governance can set a new fee. - - @param _fee The new fee percent. Out of 200. - */ - function setFee(uint256 _fee) external override onlyGov { - // Fee must be under 100%. - require(_fee <= 200, "TerminalV1::setFee: BAD_FEE"); - - // Set the fee. - fee = _fee; - - emit SetFee(_fee); - } - - /** - @notice - Allows governance to transfer its privileges to another contract. - - @dev - Only the currency governance can appoint a new governance. - - @param _pendingGovernance The governance to transition power to. - @dev This address will have to accept the responsibility in a subsequent transaction. - */ - function appointGovernance(address payable _pendingGovernance) - external - override - onlyGov - { - // The new governance can't be the zero address. - require( - _pendingGovernance != address(0), - "TerminalV1::appointGovernance: ZERO_ADDRESS" - ); - // The new governance can't be the same as the current governance. - require( - _pendingGovernance != governance, - "TerminalV1::appointGovernance: NO_OP" - ); - - // Set the appointed governance as pending. - pendingGovernance = _pendingGovernance; - - emit AppointGovernance(_pendingGovernance); - } - - /** - @notice - Allows contract to accept its appointment as the new governance. - */ - function acceptGovernance() external override { - // Only the pending governance address can accept. - require( - msg.sender == pendingGovernance, - "TerminalV1::acceptGovernance: UNAUTHORIZED" - ); - - // Get a reference to the pending governance. - address payable _pendingGovernance = pendingGovernance; - - // Set the govenance to the pending value. - governance = _pendingGovernance; - - emit AcceptGovernance(_pendingGovernance); - } - - // --- public transactions --- // - - /** - @notice - Prints all reserved tickets for a project. - - @param _projectId The ID of the project to which the reserved tickets belong. - - @return amount The amount of tickets that are being printed. - */ - function printReservedTickets(uint256 _projectId) - public - override - returns (uint256 amount) - { - // Get the current funding cycle to read the reserved rate from. - FundingCycle memory _fundingCycle = fundingCycles.currentOf(_projectId); - - // If there's no funding cycle, there's no reserved tickets to print. - if (_fundingCycle.id == 0) return 0; - - // Get a reference to new total supply of tickets before printing reserved tickets. - uint256 _totalTickets = ticketBooth.totalSupplyOf(_projectId); - - // Get a reference to the number of tickets that need to be printed. - // If there's no funding cycle, there's no tickets to print. - // The reserved rate is in bits 8-15 of the metadata. - amount = _reservedTicketAmountFrom( - _processedTicketTrackerOf[_projectId], - uint256(uint8(_fundingCycle.metadata >> 8)), - _totalTickets - ); - - // If there's nothing to print, return. - if (amount == 0) return amount; - - // Make sure int casting isnt overflowing the int. 2^255 - 1 is the largest number that can be stored in an int. - require( - _totalTickets + amount <= uint256(type(int256).max), - "TerminalV1::printReservedTickets: INT_LIMIT_REACHED" - ); - - // Set the tracker to be the new total supply. - _processedTicketTrackerOf[_projectId] = int256(_totalTickets + amount); - - // Distribute tickets to mods and get a reference to the leftover amount to print after all mods have had their share printed. - uint256 _leftoverTicketAmount = _distributeToTicketMods( - _fundingCycle, - amount - ); - - // Get a reference to the project owner. - address _owner = projects.ownerOf(_projectId); - - // Print any remaining reserved tickets to the owner. - if (_leftoverTicketAmount > 0) - ticketBooth.print(_owner, _projectId, _leftoverTicketAmount, false); - - emit PrintReserveTickets( - _fundingCycle.id, - _projectId, - _owner, - amount, - _leftoverTicketAmount, - msg.sender - ); - } - - // --- private helper functions --- // - - /** - @notice - Pays out the mods for the specified funding cycle. - - @param _fundingCycle The funding cycle to base the distribution on. - @param _amount The total amount being paid out. - @param _memo A memo to send along with project payouts. - - @return leftoverAmount If the mod percents dont add up to 100%, the leftover amount is returned. - - */ - function _distributeToPayoutMods( - FundingCycle memory _fundingCycle, - uint256 _amount, - string memory _memo - ) private returns (uint256 leftoverAmount) { - // Set the leftover amount to the initial amount. - leftoverAmount = _amount; - - // Get a reference to the project's payout mods. - PayoutMod[] memory _mods = modStore.payoutModsOf( - _fundingCycle.projectId, - _fundingCycle.configured - ); - - if (_mods.length == 0) return leftoverAmount; - - //Transfer between all mods. - for (uint256 _i = 0; _i < _mods.length; _i++) { - // Get a reference to the mod being iterated on. - PayoutMod memory _mod = _mods[_i]; - - // The amount to send towards mods. Mods percents are out of 10000. - uint256 _modCut = PRBMath.mulDiv(_amount, _mod.percent, 10000); - - if (_modCut > 0) { - // Transfer ETH to the mod. - // If there's an allocator set, transfer to its `allocate` function. - if (_mod.allocator != IModAllocator(address(0))) { - _mod.allocator.allocate{value: _modCut}( - _fundingCycle.projectId, - _mod.projectId, - _mod.beneficiary - ); - } else if (_mod.projectId != 0) { - // Otherwise, if a project is specified, make a payment to it. - - // Get a reference to the Juicebox terminal being used. - ITerminal _terminal = terminalDirectory.terminalOf( - _mod.projectId - ); - - // The project must have a terminal to send funds to. - require( - _terminal != ITerminal(address(0)), - "TerminalV1::tap: BAD_MOD" - ); - - // Save gas if this contract is being used as the terminal. - if (_terminal == this) { - _pay( - _mod.projectId, - _modCut, - _mod.beneficiary, - _memo, - _mod.preferUnstaked - ); - } else { - _terminal.pay{value: _modCut}( - _mod.projectId, - _mod.beneficiary, - _memo, - _mod.preferUnstaked - ); - } - } else { - // Otherwise, send the funds directly to the beneficiary. - Address.sendValue(_mod.beneficiary, _modCut); - } - } - - // Subtract from the amount to be sent to the beneficiary. - leftoverAmount = leftoverAmount - _modCut; - - emit DistributeToPayoutMod( - _fundingCycle.id, - _fundingCycle.projectId, - _mod, - _modCut, - msg.sender - ); - } - } - - /** - @notice - distributed tickets to the mods for the specified funding cycle. - - @param _fundingCycle The funding cycle to base the ticket distribution on. - @param _amount The total amount of tickets to print. - - @return leftoverAmount If the mod percents dont add up to 100%, the leftover amount is returned. - - */ - function _distributeToTicketMods( - FundingCycle memory _fundingCycle, - uint256 _amount - ) private returns (uint256 leftoverAmount) { - // Set the leftover amount to the initial amount. - leftoverAmount = _amount; - - // Get a reference to the project's ticket mods. - TicketMod[] memory _mods = modStore.ticketModsOf( - _fundingCycle.projectId, - _fundingCycle.configured - ); - - //Transfer between all mods. - for (uint256 _i = 0; _i < _mods.length; _i++) { - // Get a reference to the mod being iterated on. - TicketMod memory _mod = _mods[_i]; - - // The amount to send towards mods. Mods percents are out of 10000. - uint256 _modCut = PRBMath.mulDiv(_amount, _mod.percent, 10000); - - // Print tickets for the mod if needed. - if (_modCut > 0) - ticketBooth.print( - _mod.beneficiary, - _fundingCycle.projectId, - _modCut, - _mod.preferUnstaked - ); - - // Subtract from the amount to be sent to the beneficiary. - leftoverAmount = leftoverAmount - _modCut; - - emit DistributeToTicketMod( - _fundingCycle.id, - _fundingCycle.projectId, - _mod, - _modCut, - msg.sender - ); - } - } - - /** - @notice - See the documentation for 'pay'. - */ - function _pay( - uint256 _projectId, - uint256 _amount, - address _beneficiary, - string memory _memo, - bool _preferUnstakedTickets - ) private returns (uint256) { - // Get a reference to the current funding cycle for the project. - FundingCycle memory _fundingCycle = fundingCycles.currentOf(_projectId); - - // Use the funding cycle's weight if it exists. Otherwise use the base weight. - uint256 _weight = _fundingCycle.number == 0 - ? fundingCycles.BASE_WEIGHT() - : _fundingCycle.weight; - - // Multiply the amount by the funding cycle's weight to determine the amount of tickets to print. - uint256 _weightedAmount = PRBMathUD60x18.mul(_amount, _weight); - - // Use the funding cycle's reserved rate if it exists. Otherwise don't set a reserved rate. - // The reserved rate is stored in bytes 8-15 of the metadata property. - uint256 _reservedRate = _fundingCycle.number == 0 - ? 0 - : uint256(uint8(_fundingCycle.metadata >> 8)); - - // Only print the tickets that are unreserved. - uint256 _unreservedWeightedAmount = PRBMath.mulDiv( - _weightedAmount, - 200 - _reservedRate, - 200 - ); - - // Add to the balance of the project. - balanceOf[_projectId] = balanceOf[_projectId] + _amount; - - // If theres an unreserved weighted amount, print tickets representing this amount for the beneficiary. - if (_unreservedWeightedAmount > 0) { - // If there's no funding cycle, track this payment as having been made before a configuration. - if (_fundingCycle.number == 0) { - // Mark the premined tickets as processed so that reserved tickets can't later be printed against them. - // Make sure int casting isnt overflowing the int. 2^255 - 1 is the largest number that can be stored in an int. - require( - _processedTicketTrackerOf[_projectId] < 0 || - uint256(_processedTicketTrackerOf[_projectId]) + - uint256(_weightedAmount) <= - uint256(type(int256).max), - "TerminalV1::printTickets: INT_LIMIT_REACHED" - ); - _processedTicketTrackerOf[_projectId] = - _processedTicketTrackerOf[_projectId] + - int256(_unreservedWeightedAmount); - - // If theres no funding cycle, add these tickets to the amount that were printed before a funding cycle was configured. - _preconfigureTicketCountOf[_projectId] = - _preconfigureTicketCountOf[_projectId] + - _unreservedWeightedAmount; - } - - // Print the project's tickets for the beneficiary. - ticketBooth.print( - _beneficiary, - _projectId, - _unreservedWeightedAmount, - _preferUnstakedTickets - ); - } else if (_weightedAmount > 0) { - // If there is no unreserved weight amount but there is a weighted amount, - // the full weighted amount should be explicitly tracked as reserved since no unreserved tickets were printed. - - // Subtract the total weighted amount from the tracker so the full reserved ticket amount can be printed later. - // Make sure int casting isnt overflowing the int. 2^255 - 1 is the largest number that can be stored in an int. - require( - _processedTicketTrackerOf[_projectId] > 0 || - uint256(-_processedTicketTrackerOf[_projectId]) + - uint256(_weightedAmount) <= - uint256(type(int256).max), - "TerminalV1::printTickets: INT_LIMIT_REACHED" - ); - _processedTicketTrackerOf[_projectId] = - _processedTicketTrackerOf[_projectId] - - int256(_weightedAmount); - } - - emit Pay( - _fundingCycle.id, - _projectId, - _beneficiary, - _amount, - _memo, - msg.sender - ); - - return _fundingCycle.id; - } - - /** - @notice - Gets the amount overflowed in relation to the provided funding cycle. - - @dev - This amount changes as the price of ETH changes against the funding cycle's currency. - - @param _currentFundingCycle The ID of the funding cycle to base the overflow on. - - @return overflow The current overflow of funds. - */ - function _overflowFrom(FundingCycle memory _currentFundingCycle) - private - view - returns (uint256) - { - // Get the current price of ETH. - uint256 _ethPrice = prices.getETHPriceFor( - _currentFundingCycle.currency - ); - - // Get a reference to the amount still tappable in the current funding cycle. - uint256 _limit = _currentFundingCycle.target - - _currentFundingCycle.tapped; - - // The amount of ETH that the owner could currently still tap if its available. This amount isn't considered overflow. - uint256 _ethLimit = _limit == 0 - ? 0 - : PRBMathUD60x18.div(_limit, _ethPrice); - - // Get the current balance of the project. - uint256 _balanceOf = balanceOf[_currentFundingCycle.projectId]; - - // Overflow is the balance of this project minus the reserved amount. - return _balanceOf < _ethLimit ? 0 : _balanceOf - _ethLimit; - } - - /** - @notice - Gets the amount of reserved tickets currently tracked for a project given a reserved rate. - - @param _processedTicketTracker The tracker to make the calculation with. - @param _reservedRate The reserved rate to use to make the calculation. - @param _totalEligibleTickets The total amount to make the calculation with. - - @return amount reserved ticket amount. - */ - function _reservedTicketAmountFrom( - int256 _processedTicketTracker, - uint256 _reservedRate, - uint256 _totalEligibleTickets - ) private pure returns (uint256) { - // Get a reference to the amount of tickets that are unprocessed. - uint256 _unprocessedTicketBalanceOf = _processedTicketTracker >= 0 // preconfigure tickets shouldn't contribute to the reserved ticket amount. - ? _totalEligibleTickets - uint256(_processedTicketTracker) - : _totalEligibleTickets + uint256(-_processedTicketTracker); - - // If there are no unprocessed tickets, return. - if (_unprocessedTicketBalanceOf == 0) return 0; - - // If all tickets are reserved, return the full unprocessed amount. - if (_reservedRate == 200) return _unprocessedTicketBalanceOf; - - return - PRBMath.mulDiv( - _unprocessedTicketBalanceOf, - 200, - 200 - _reservedRate - ) - _unprocessedTicketBalanceOf; - } - - /** - @notice - Validate and pack the funding cycle metadata. - - @param _metadata The metadata to validate and pack. - - @return packed The packed uint256 of all metadata params. The first 8 bytes specify the version. - */ - function _validateAndPackFundingCycleMetadata( - FundingCycleMetadata memory _metadata - ) private pure returns (uint256 packed) { - // The reserved project ticket rate must be less than or equal to 200. - require( - _metadata.reservedRate <= 200, - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RESERVED_RATE" - ); - - // The bonding curve rate must be between 0 and 200. - require( - _metadata.bondingCurveRate <= 200, - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_BONDING_CURVE_RATE" - ); - - // The reconfiguration bonding curve rate must be less than or equal to 200. - require( - _metadata.reconfigurationBondingCurveRate <= 200, - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RECONFIGURATION_BONDING_CURVE_RATE" - ); - - // version 0 in the first 8 bytes. - packed = 0; - // reserved rate in bytes 8-15. - packed |= _metadata.reservedRate << 8; - // bonding curve in bytes 16-23. - packed |= _metadata.bondingCurveRate << 16; - // reconfiguration bonding curve rate in bytes 24-31. - packed |= _metadata.reconfigurationBondingCurveRate << 24; - } - - /** - @notice - Takes a fee into the Governance contract's project. - - @param _from The amount to take a fee from. - @param _percent The percent fee to take. Out of 200. - @param _beneficiary The address to print governance's tickets for. - @param _memo A memo to send with the fee. - - @return feeAmount The amount of the fee taken. - */ - function _takeFee( - uint256 _from, - uint256 _percent, - address _beneficiary, - string memory _memo - ) private returns (uint256 feeAmount) { - // The amount of ETH from the _tappedAmount to pay as a fee. - feeAmount = _from - PRBMath.mulDiv(_from, 200, _percent + 200); - - // Nothing to do if there's no fee to take. - if (feeAmount == 0) return 0; - - // When processing the admin fee, save gas if the admin is using this contract as its terminal. - if ( - terminalDirectory.terminalOf( - JuiceboxProject(governance).projectId() - ) == this - ) { - // Use the local pay call. - _pay( - JuiceboxProject(governance).projectId(), - feeAmount, - _beneficiary, - _memo, - false - ); - } else { - // Use the external pay call of the governance contract. - JuiceboxProject(governance).pay{value: feeAmount}( - _beneficiary, - _memo, - false - ); - } - } -} diff --git a/packages/hardhat/contracts/TicketBooth.sol b/packages/hardhat/contracts/TicketBooth.sol deleted file mode 100644 index 25690b84e3..0000000000 --- a/packages/hardhat/contracts/TicketBooth.sol +++ /dev/null @@ -1,552 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./interfaces/ITicketBooth.sol"; -import "./abstract/Operatable.sol"; -import "./abstract/TerminalUtility.sol"; - -import "./libraries/Operations.sol"; - -import "./Tickets.sol"; - -/** - @notice - Manage Ticket printing, redemption, and account balances. - - @dev - Tickets can be either represented internally staked, or as unstaked ERC-20s. - This contract manages these two representations and the conversion between the two. - - @dev - The total supply of a project's tickets and the balance of each account are calculated in this contract. -*/ -contract TicketBooth is TerminalUtility, Operatable, ITicketBooth { - // --- public immutable stored properties --- // - - /// @notice The Projects contract which mints ERC-721's that represent project ownership and transfers. - IProjects public immutable override projects; - - // --- public stored properties --- // - - // Each project's ERC20 Ticket tokens. - mapping(uint256 => ITickets) public override ticketsOf; - - // Each holder's balance of staked Tickets for each project. - mapping(address => mapping(uint256 => uint256)) - public - override stakedBalanceOf; - - // The total supply of 1155 tickets for each project. - mapping(uint256 => uint256) public override stakedTotalSupplyOf; - - // The amount of each holders tickets that are locked. - mapping(address => mapping(uint256 => uint256)) - public - override lockedBalanceOf; - - // The amount of each holders tickets that are locked by each address. - mapping(address => mapping(address => mapping(uint256 => uint256))) - public - override lockedBalanceBy; - - // --- external views --- // - - /** - @notice - The total supply of tickets for each project, including staked and unstaked tickets. - - @param _projectId The ID of the project to get the total supply of. - - @return supply The total supply. - */ - function totalSupplyOf(uint256 _projectId) - external - view - override - returns (uint256 supply) - { - supply = stakedTotalSupplyOf[_projectId]; - ITickets _tickets = ticketsOf[_projectId]; - if (_tickets != ITickets(address(0))) - supply = supply + _tickets.totalSupply(); - } - - /** - @notice - The total balance of tickets a holder has for a specified project, including staked and unstaked tickets. - - @param _holder The ticket holder to get a balance for. - @param _projectId The project to get the `_hodler`s balance of. - - @return balance The balance. - */ - function balanceOf(address _holder, uint256 _projectId) - external - view - override - returns (uint256 balance) - { - balance = stakedBalanceOf[_holder][_projectId]; - ITickets _ticket = ticketsOf[_projectId]; - if (_ticket != ITickets(address(0))) - balance = balance + _ticket.balanceOf(_holder); - } - - // --- external transactions --- // - - /** - @param _projects A Projects contract which mints ERC-721's that represent project ownership and transfers. - @param _operatorStore A contract storing operator assignments. - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor( - IProjects _projects, - IOperatorStore _operatorStore, - ITerminalDirectory _terminalDirectory - ) Operatable(_operatorStore) TerminalUtility(_terminalDirectory) { - projects = _projects; - } - - /** - @notice - Issues an owner's ERC-20 Tickets that'll be used when unstaking tickets. - - @dev - Deploys an owner's Ticket ERC-20 token contract. - - @param _projectId The ID of the project being issued tickets. - @param _name The ERC-20's name. " Juicebox ticket" will be appended. - @param _symbol The ERC-20's symbol. "j" will be prepended. - */ - function issue( - uint256 _projectId, - string calldata _name, - string calldata _symbol - ) - external - override - requirePermission( - projects.ownerOf(_projectId), - _projectId, - Operations.Issue - ) - { - // There must be a name. - require((bytes(_name).length > 0), "TicketBooth::issue: EMPTY_NAME"); - - // There must be a symbol. - require( - (bytes(_symbol).length > 0), - "TicketBooth::issue: EMPTY_SYMBOL" - ); - - // Only one ERC20 ticket can be issued. - require( - ticketsOf[_projectId] == ITickets(address(0)), - "TicketBooth::issue: ALREADY_ISSUED" - ); - - // Create the contract in this TerminalV1 contract in order to have mint and burn privileges. - // Prepend the strings with standards. - ticketsOf[_projectId] = new Tickets(_name, _symbol); - - emit Issue(_projectId, _name, _symbol, msg.sender); - } - - /** - @notice - Print new tickets. - - @dev - Only a project's current terminal can print its tickets. - - @param _holder The address receiving the new tickets. - @param _projectId The project to which the tickets belong. - @param _amount The amount to print. - @param _preferUnstakedTickets Whether ERC20's should be converted automatically if they have been issued. - */ - function print( - address _holder, - uint256 _projectId, - uint256 _amount, - bool _preferUnstakedTickets - ) external override onlyTerminal(_projectId) { - // An amount must be specified. - require(_amount > 0, "TicketBooth::print: NO_OP"); - - // Get a reference to the project's ERC20 tickets. - ITickets _tickets = ticketsOf[_projectId]; - - // If there exists ERC-20 tickets and the caller prefers these unstaked tickets. - bool _shouldUnstakeTickets = _preferUnstakedTickets && - _tickets != ITickets(address(0)); - - if (_shouldUnstakeTickets) { - // Print the equivalent amount of ERC20s. - _tickets.print(_holder, _amount); - } else { - // Add to the staked balance and total supply. - stakedBalanceOf[_holder][_projectId] = - stakedBalanceOf[_holder][_projectId] + - _amount; - stakedTotalSupplyOf[_projectId] = - stakedTotalSupplyOf[_projectId] + - _amount; - } - - emit Print( - _holder, - _projectId, - _amount, - _shouldUnstakeTickets, - _preferUnstakedTickets, - msg.sender - ); - } - - /** - @notice - Redeems tickets. - - @dev - Only a project's current terminal can redeem its tickets. - - @param _holder The address that owns the tickets being redeemed. - @param _projectId The ID of the project of the tickets being redeemed. - @param _amount The amount of tickets being redeemed. - @param _preferUnstaked If the preference is to redeem tickets that have been converted to ERC-20s. - */ - function redeem( - address _holder, - uint256 _projectId, - uint256 _amount, - bool _preferUnstaked - ) external override onlyTerminal(_projectId) { - // Get a reference to the project's ERC20 tickets. - ITickets _tickets = ticketsOf[_projectId]; - - // Get a reference to the staked amount. - uint256 _unlockedStakedBalance = stakedBalanceOf[_holder][_projectId] - - lockedBalanceOf[_holder][_projectId]; - - // Get a reference to the number of tickets there are. - uint256 _unstakedBalanceOf = _tickets == ITickets(address(0)) - ? 0 - : _tickets.balanceOf(_holder); - - // There must be enough tickets. - // Prevent potential overflow by not relying on addition. - require( - (_amount < _unstakedBalanceOf && - _amount < _unlockedStakedBalance) || - (_amount >= _unstakedBalanceOf && - _unlockedStakedBalance >= _amount - _unstakedBalanceOf) || - (_amount >= _unlockedStakedBalance && - _unstakedBalanceOf >= _amount - _unlockedStakedBalance), - "TicketBooth::redeem: INSUFFICIENT_FUNDS" - ); - - // The amount of tickets to redeem. - uint256 _unstakedTicketsToRedeem; - - // If there's no balance, redeem no tickets - if (_unstakedBalanceOf == 0) { - _unstakedTicketsToRedeem = 0; - // If prefer converted, redeem tickets before redeeming staked tickets. - } else if (_preferUnstaked) { - _unstakedTicketsToRedeem = _unstakedBalanceOf >= _amount - ? _amount - : _unstakedBalanceOf; - // Otherwise, redeem staked tickets before unstaked tickets. - } else { - _unstakedTicketsToRedeem = _unlockedStakedBalance >= _amount - ? 0 - : _amount - _unlockedStakedBalance; - } - - // The amount of staked tickets to redeem. - uint256 _stakedTicketsToRedeem = _amount - _unstakedTicketsToRedeem; - - // Redeem the tickets. - if (_unstakedTicketsToRedeem > 0) - _tickets.redeem(_holder, _unstakedTicketsToRedeem); - if (_stakedTicketsToRedeem > 0) { - // Reduce the holders balance and the total supply. - stakedBalanceOf[_holder][_projectId] = - stakedBalanceOf[_holder][_projectId] - - _stakedTicketsToRedeem; - stakedTotalSupplyOf[_projectId] = - stakedTotalSupplyOf[_projectId] - - _stakedTicketsToRedeem; - } - - emit Redeem( - _holder, - _projectId, - _amount, - _unlockedStakedBalance, - _preferUnstaked, - msg.sender - ); - } - - /** - @notice - Stakes ERC20 tickets by burning their supply and creating an internal staked version. - - @dev - Only a ticket holder or an operator can stake its tickets. - - @param _holder The owner of the tickets to stake. - @param _projectId The ID of the project whos tickets are being staked. - @param _amount The amount of tickets to stake. - */ - function stake( - address _holder, - uint256 _projectId, - uint256 _amount - ) - external - override - requirePermissionAllowingWildcardDomain( - _holder, - _projectId, - Operations.Stake - ) - { - // Get a reference to the project's ERC20 tickets. - ITickets _tickets = ticketsOf[_projectId]; - - // Tickets must have been issued. - require( - _tickets != ITickets(address(0)), - "TicketBooth::stake: NOT_FOUND" - ); - - // Get a reference to the holder's current balance. - uint256 _unstakedBalanceOf = _tickets.balanceOf(_holder); - - // There must be enough balance to stake. - require( - _unstakedBalanceOf >= _amount, - "TicketBooth::stake: INSUFFICIENT_FUNDS" - ); - - // Redeem the equivalent amount of ERC20s. - _tickets.redeem(_holder, _amount); - - // Add the staked amount from the holder's balance. - stakedBalanceOf[_holder][_projectId] = - stakedBalanceOf[_holder][_projectId] + - _amount; - - // Add the staked amount from the project's total supply. - stakedTotalSupplyOf[_projectId] = - stakedTotalSupplyOf[_projectId] + - _amount; - - emit Stake(_holder, _projectId, _amount, msg.sender); - } - - /** - @notice - Unstakes internal tickets by creating and distributing ERC20 tickets. - - @dev - Only a ticket holder or an operator can unstake its tickets. - - @param _holder The owner of the tickets to unstake. - @param _projectId The ID of the project whos tickets are being unstaked. - @param _amount The amount of tickets to unstake. - */ - function unstake( - address _holder, - uint256 _projectId, - uint256 _amount - ) - external - override - requirePermissionAllowingWildcardDomain( - _holder, - _projectId, - Operations.Unstake - ) - { - // Get a reference to the project's ERC20 tickets. - ITickets _tickets = ticketsOf[_projectId]; - - // Tickets must have been issued. - require( - _tickets != ITickets(address(0)), - "TicketBooth::unstake: NOT_FOUND" - ); - - // Get a reference to the amount of unstaked tickets. - uint256 _unlockedStakedTickets = stakedBalanceOf[_holder][_projectId] - - lockedBalanceOf[_holder][_projectId]; - - // There must be enough unlocked staked tickets to unstake. - require( - _unlockedStakedTickets >= _amount, - "TicketBooth::unstake: INSUFFICIENT_FUNDS" - ); - - // Subtract the unstaked amount from the holder's balance. - stakedBalanceOf[_holder][_projectId] = - stakedBalanceOf[_holder][_projectId] - - _amount; - - // Subtract the unstaked amount from the project's total supply. - stakedTotalSupplyOf[_projectId] = - stakedTotalSupplyOf[_projectId] - - _amount; - - // Print the equivalent amount of ERC20s. - _tickets.print(_holder, _amount); - - emit Unstake(_holder, _projectId, _amount, msg.sender); - } - - /** - @notice - Lock a project's tickets, preventing them from being redeemed and from converting to ERC20s. - - @dev - Only a ticket holder or an operator can lock its tickets. - - @param _holder The holder to lock tickets from. - @param _projectId The ID of the project whos tickets are being locked. - @param _amount The amount of tickets to lock. - */ - function lock( - address _holder, - uint256 _projectId, - uint256 _amount - ) - external - override - requirePermissionAllowingWildcardDomain( - _holder, - _projectId, - Operations.Lock - ) - { - // Amount must be greater than 0. - require(_amount > 0, "TicketBooth::lock: NO_OP"); - - // The holder must have enough tickets to lock. - require( - stakedBalanceOf[_holder][_projectId] - - lockedBalanceOf[_holder][_projectId] >= - _amount, - "TicketBooth::lock: INSUFFICIENT_FUNDS" - ); - - // Update the lock. - lockedBalanceOf[_holder][_projectId] = - lockedBalanceOf[_holder][_projectId] + - _amount; - lockedBalanceBy[msg.sender][_holder][_projectId] = - lockedBalanceBy[msg.sender][_holder][_projectId] + - _amount; - - emit Lock(_holder, _projectId, _amount, msg.sender); - } - - /** - @notice - Unlock a project's tickets. - - @dev - The address that locked the tickets must be the address that unlocks the tickets. - - @param _holder The holder to unlock tickets from. - @param _projectId The ID of the project whos tickets are being unlocked. - @param _amount The amount of tickets to unlock. - */ - function unlock( - address _holder, - uint256 _projectId, - uint256 _amount - ) external override { - // Amount must be greater than 0. - require(_amount > 0, "TicketBooth::unlock: NO_OP"); - - // There must be enough locked tickets to unlock. - require( - lockedBalanceBy[msg.sender][_holder][_projectId] >= _amount, - "TicketBooth::unlock: INSUFFICIENT_FUNDS" - ); - - // Update the lock. - lockedBalanceOf[_holder][_projectId] = - lockedBalanceOf[_holder][_projectId] - - _amount; - lockedBalanceBy[msg.sender][_holder][_projectId] = - lockedBalanceBy[msg.sender][_holder][_projectId] - - _amount; - - emit Unlock(_holder, _projectId, _amount, msg.sender); - } - - /** - @notice - Allows a ticket holder to transfer its tickets to another account, without unstaking to ERC-20s. - - @dev - Only a ticket holder or an operator can transfer its tickets. - - @param _holder The holder to transfer tickets from. - @param _projectId The ID of the project whos tickets are being transfered. - @param _amount The amount of tickets to transfer. - @param _recipient The recipient of the tickets. - */ - function transfer( - address _holder, - uint256 _projectId, - uint256 _amount, - address _recipient - ) - external - override - requirePermissionAllowingWildcardDomain( - _holder, - _projectId, - Operations.Transfer - ) - { - // Can't transfer to the zero address. - require( - _recipient != address(0), - "TicketBooth::transfer: ZERO_ADDRESS" - ); - - // An address can't transfer to itself. - require(_holder != _recipient, "TicketBooth::transfer: IDENTITY"); - - // There must be an amount to transfer. - require(_amount > 0, "TicketBooth::transfer: NO_OP"); - - // Get a reference to the amount of unlocked staked tickets. - uint256 _unlockedStakedTickets = stakedBalanceOf[_holder][_projectId] - - lockedBalanceOf[_holder][_projectId]; - - // There must be enough unlocked staked tickets to transfer. - require( - _amount <= _unlockedStakedTickets, - "TicketBooth::transfer: INSUFFICIENT_FUNDS" - ); - - // Subtract from the holder. - stakedBalanceOf[_holder][_projectId] = - stakedBalanceOf[_holder][_projectId] - - _amount; - - // Add the tickets to the recipient. - stakedBalanceOf[_recipient][_projectId] = - stakedBalanceOf[_recipient][_projectId] + - _amount; - - emit Transfer(_holder, _projectId, _recipient, _amount, msg.sender); - } -} diff --git a/packages/hardhat/contracts/Tickets.sol b/packages/hardhat/contracts/Tickets.sol deleted file mode 100644 index c45eff28eb..0000000000 --- a/packages/hardhat/contracts/Tickets.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; -import "@paulrberg/contracts/token/erc20/Erc20Permit.sol"; - -import "./interfaces/ITickets.sol"; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract Tickets is ERC20, ERC20Permit, Ownable, ITickets { - constructor(string memory _name, string memory _symbol) - ERC20(_name, _symbol) - ERC20Permit(_name) - {} - - function print(address _account, uint256 _amount) - external - override - onlyOwner - { - return _mint(_account, _amount); - } - - function redeem(address _account, uint256 _amount) - external - override - onlyOwner - { - return _burn(_account, _amount); - } -} diff --git a/packages/hardhat/contracts/TokenRepresentationProxy.sol b/packages/hardhat/contracts/TokenRepresentationProxy.sol deleted file mode 100644 index 8c2ec92b24..0000000000 --- a/packages/hardhat/contracts/TokenRepresentationProxy.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -import "./TicketBooth.sol"; - -/** - @notice - ERC20 wrapper for TicketBooth calls that return both staked + unstaked for a project's token supply. -*/ -contract TokenRepresentationProxy is ERC20 { - ITicketBooth ticketBooth; - uint256 projectId; - - constructor( - ITicketBooth _ticketBooth, - uint256 _projectId, - string memory name, - string memory ticker - ) ERC20(name, ticker) { - ticketBooth = _ticketBooth; - projectId = _projectId; - } - - function totalSupply() public view virtual override returns (uint256) { - return ticketBooth.totalSupplyOf(projectId); - } - - function balanceOf(address _account) public view virtual override returns (uint256) { - return ticketBooth.balanceOf(_account, projectId); - } -} \ No newline at end of file diff --git a/packages/hardhat/contracts/YearnYielder.sol b/packages/hardhat/contracts/YearnYielder.sol deleted file mode 100644 index dd0276a160..0000000000 --- a/packages/hardhat/contracts/YearnYielder.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -import "@paulrberg/contracts/math/PRBMath.sol"; - -import "./interfaces/IYielder.sol"; -import "./interfaces/ITerminalV1.sol"; -import "./interfaces/IyVaultV2.sol"; -import "./interfaces/IWETH.sol"; - -contract YearnYielder is IYielder, Ownable { - using SafeERC20 for IERC20; - - IyVaultV2 public wethVault = - IyVaultV2(0xa9fE4601811213c340e850ea305481afF02f5b28); - - address public weth; - - uint256 public override deposited = 0; - - uint256 public decimals; - - constructor(address _weth) { - require(wethVault.token() == _weth, "YearnYielder: INCOMPATIBLE"); - weth = _weth; - decimals = IWETH(weth).decimals(); - updateApproval(); - } - - function getCurrentBalance() public view override returns (uint256) { - return _sharesToTokens(wethVault.balanceOf(address(this))); - } - - function deposit() external payable override onlyOwner { - IWETH(weth).deposit{value: msg.value}(); - wethVault.deposit(msg.value); - deposited = deposited + msg.value; - } - - function withdraw(uint256 _amount, address payable _beneficiary) - public - override - onlyOwner - { - // Reduce the proportional amount that has been deposited before the withdrawl. - deposited = - deposited - - PRBMath.mulDiv(_amount, deposited, getCurrentBalance()); - - // Withdraw the amount of tokens from the vault. - wethVault.withdraw(_tokensToShares(_amount)); - - // Convert weth back to eth. - IWETH(weth).withdraw(_amount); - - // Move the funds to the TerminalV1. - _beneficiary.transfer(_amount); - } - - function withdrawAll(address payable _beneficiary) - external - override - onlyOwner - returns (uint256 _balance) - { - _balance = getCurrentBalance(); - withdraw(_balance, _beneficiary); - } - - /// @dev Updates the vaults approval of the token to be the maximum value. - function updateApproval() public { - IERC20(weth).safeApprove(address(wethVault), type(uint256).max); - } - - /// @dev Computes the number of tokens an amount of shares is worth. - /// - /// @param _sharesAmount the amount of shares. - /// - /// @return the number of tokens the shares are worth. - function _sharesToTokens(uint256 _sharesAmount) - private - view - returns (uint256) - { - return - PRBMath.mulDiv( - _sharesAmount, - wethVault.pricePerShare(), - 10**decimals - ); - } - - /// @dev Computes the number of shares an amount of tokens is worth. - /// - /// @param _tokensAmount the amount of shares. - /// - /// @return the number of shares the tokens are worth. - function _tokensToShares(uint256 _tokensAmount) - private - view - returns (uint256) - { - return - PRBMath.mulDiv( - _tokensAmount, - 10**decimals, - wethVault.pricePerShare() - ); - } -} diff --git a/packages/hardhat/contracts/abstract/JuiceboxProject.sol b/packages/hardhat/contracts/abstract/JuiceboxProject.sol deleted file mode 100644 index 0d6fb49b15..0000000000 --- a/packages/hardhat/contracts/abstract/JuiceboxProject.sol +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "./../interfaces/ITerminalV1.sol"; - -/** - @notice A contract that inherits from JuiceboxProject can use Juicebox as a business-model-as-a-service. - @dev The owner of the contract makes admin decisions such as: - - Which address is the funding cycle owner, which can tap funds from the funding cycle. - - Should this project's Tickets be migrated to a new TerminalV1. -*/ -abstract contract JuiceboxProject is IERC721Receiver, Ownable { - /// @notice The direct deposit terminals. - ITerminalDirectory public immutable terminalDirectory; - - /// @notice The ID of the project that should be used to forward this contract's received payments. - uint256 public projectId; - - /** - @param _projectId The ID of the project that should be used to forward this contract's received payments. - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor(uint256 _projectId, ITerminalDirectory _terminalDirectory) { - projectId = _projectId; - terminalDirectory = _terminalDirectory; - } - - receive() external payable {} - - /** - @notice Withdraws funds stored in this contract. - @param _beneficiary The address to send the funds to. - @param _amount The amount to send. - */ - function withdraw(address payable _beneficiary, uint256 _amount) - external - onlyOwner - { - Address.sendValue(_beneficiary, _amount); - } - - /** - @notice Allows the project that is being managed to be set. - @param _projectId The ID of the project that is being managed. - */ - function setProjectId(uint256 _projectId) external onlyOwner { - projectId = _projectId; - } - - /** - @notice Make a payment to this project. - @param _beneficiary The address who will receive tickets from this fee. - @param _memo A memo that will be included in the published event. - @param _preferUnstakedTickets Whether ERC20's should be claimed automatically if they have been issued. - */ - function pay( - address _beneficiary, - string calldata _memo, - bool _preferUnstakedTickets - ) external payable { - require(projectId != 0, "JuiceboxProject::pay: PROJECT_NOT_FOUND"); - - // Get the terminal for this contract's project. - ITerminal _terminal = terminalDirectory.terminalOf(projectId); - - // There must be a terminal. - require( - _terminal != ITerminal(address(0)), - "JuiceboxProject::pay: TERMINAL_NOT_FOUND" - ); - - _terminal.pay{value: msg.value}( - projectId, - _beneficiary, - _memo, - _preferUnstakedTickets - ); - } - - /** - @notice Transfer the ownership of the project to a new owner. - @dev This contract will no longer be able to reconfigure or tap funds from this project. - @param _projects The projects contract. - @param _newOwner The new project owner. - @param _projectId The ID of the project to transfer ownership of. - @param _data Arbitrary data to include in the transaction. - */ - function transferProjectOwnership( - IProjects _projects, - address _newOwner, - uint256 _projectId, - bytes calldata _data - ) external onlyOwner { - _projects.safeTransferFrom(address(this), _newOwner, _projectId, _data); - } - - /** - @notice Allows this contract to receive a project. - */ - function onERC721Received( - address, - address, - uint256, - bytes calldata - ) public pure override returns (bytes4) { - return this.onERC721Received.selector; - } - - function setOperator( - IOperatorStore _operatorStore, - address _operator, - uint256 _projectId, - uint256[] calldata _permissionIndexes - ) external onlyOwner { - _operatorStore.setOperator(_operator, _projectId, _permissionIndexes); - } - - function setOperators( - IOperatorStore _operatorStore, - address[] calldata _operators, - uint256[] calldata _projectIds, - uint256[][] calldata _permissionIndexes - ) external onlyOwner { - _operatorStore.setOperators( - _operators, - _projectIds, - _permissionIndexes - ); - } - - /** - @notice Take a fee for this project from this contract. - @param _amount The payment amount. - @param _beneficiary The address who will receive tickets from this fee. - @param _memo A memo that will be included in the published event. - @param _preferUnstakedTickets Whether ERC20's should be claimed automatically if they have been issued. - */ - function _takeFee( - uint256 _amount, - address _beneficiary, - string memory _memo, - bool _preferUnstakedTickets - ) internal { - require(projectId != 0, "JuiceboxProject::takeFee: PROJECT_NOT_FOUND"); - // Find the terminal for this contract's project. - ITerminal _terminal = terminalDirectory.terminalOf(projectId); - - // There must be a terminal. - require( - _terminal != ITerminal(address(0)), - "JuiceboxProject::takeFee: TERMINAL_NOT_FOUND" - ); - - // There must be enough funds in the contract to take the fee. - require( - address(this).balance >= _amount, - "JuiceboxProject::takeFee: INSUFFICIENT_FUNDS" - ); - - // Send funds to the terminal. - _terminal.pay{value: _amount}( - projectId, - _beneficiary, - _memo, - _preferUnstakedTickets - ); - } -} diff --git a/packages/hardhat/contracts/abstract/Operatable.sol b/packages/hardhat/contracts/abstract/Operatable.sol deleted file mode 100644 index 59bce0e7e1..0000000000 --- a/packages/hardhat/contracts/abstract/Operatable.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./../interfaces/IOperatable.sol"; - -abstract contract Operatable is IOperatable { - modifier requirePermission( - address _account, - uint256 _domain, - uint256 _index - ) { - require( - msg.sender == _account || - operatorStore.hasPermission( - msg.sender, - _account, - _domain, - _index - ), - "Operatable: UNAUTHORIZED" - ); - _; - } - - modifier requirePermissionAllowingWildcardDomain( - address _account, - uint256 _domain, - uint256 _index - ) { - require( - msg.sender == _account || - operatorStore.hasPermission( - msg.sender, - _account, - _domain, - _index - ) || - operatorStore.hasPermission(msg.sender, _account, 0, _index), - "Operatable: UNAUTHORIZED" - ); - _; - } - - modifier requirePermissionAcceptingAlternateAddress( - address _account, - uint256 _domain, - uint256 _index, - address _alternate - ) { - require( - msg.sender == _account || - operatorStore.hasPermission( - msg.sender, - _account, - _domain, - _index - ) || - msg.sender == _alternate, - "Operatable: UNAUTHORIZED" - ); - _; - } - - /// @notice A contract storing operator assignments. - IOperatorStore public immutable override operatorStore; - - /** - @param _operatorStore A contract storing operator assignments. - */ - constructor(IOperatorStore _operatorStore) { - operatorStore = _operatorStore; - } -} diff --git a/packages/hardhat/contracts/abstract/TerminalUtility.sol b/packages/hardhat/contracts/abstract/TerminalUtility.sol deleted file mode 100644 index be8aa124ab..0000000000 --- a/packages/hardhat/contracts/abstract/TerminalUtility.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./../interfaces/ITerminalUtility.sol"; - -abstract contract TerminalUtility is ITerminalUtility { - modifier onlyTerminal(uint256 _projectId) { - require( - address(terminalDirectory.terminalOf(_projectId)) == msg.sender, - "TerminalUtility: UNAUTHORIZED" - ); - _; - } - - /// @notice The direct deposit terminals. - ITerminalDirectory public immutable override terminalDirectory; - - /** - @param _terminalDirectory A directory of a project's current Juicebox terminal to receive payments in. - */ - constructor(ITerminalDirectory _terminalDirectory) { - terminalDirectory = _terminalDirectory; - } -} diff --git a/packages/hardhat/contracts/examples/Shwotime.sol b/packages/hardhat/contracts/examples/Shwotime.sol deleted file mode 100644 index 92c8ea6dd7..0000000000 --- a/packages/hardhat/contracts/examples/Shwotime.sol +++ /dev/null @@ -1,148 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@paulrberg/contracts/math/PRBMath.sol"; - -import "../abstract/JuiceboxProject.sol"; - -/** - @dev - Shwotime allows friends to commit to buying tickets to events together. - They can commit to buying a ticket if a specified list of addresses also commit to buy the ticket. - - Not reliable for situations where networks dont entirely overlap. -*/ -contract Shwotime is JuiceboxProject { - using SafeERC20 for IERC20; - - struct Tix { - address owner; - uint256 max; - uint256 sold; - uint256 price; - uint256 expiry; - mapping(address => bool) committed; - mapping(address => bool) paid; - mapping(address => address[]) dependencies; - } - - mapping(uint256 => Tix) public tickets; - - uint256 public ticketsCount = 0; - - IERC20 public dai; - - uint256 public fee; - - constructor( - uint256 _projectId, - ITerminalDirectory _terminalDirectory, - IERC20 _dai, - uint256 _fee - ) JuiceboxProject(_projectId, _terminalDirectory) { - dai = _dai; - fee = _fee; - } - - // Create tickets to sell. - function createTickets( - uint256 _price, - uint256 _max, - uint256 _expiry - ) external { - //Store the new ticket. - ticketsCount++; - Tix storage _tickets = tickets[ticketsCount]; - _tickets.price = _price; - _tickets.max = _max; - _tickets.sold = 0; - _tickets.expiry = _expiry; - _tickets.owner = msg.sender; - } - - // commits to buying a ticket if the specified addresses also buy. - function buyTicket(uint256 id, address[] calldata addresses) external { - require( - id > 0 && id <= ticketsCount, - "Shwotime::buyTickets: NOT_FOUND" - ); - - //Mark the msg.sender as committed to buying. - Tix storage _tickets = tickets[id]; - - require( - _tickets.expiry > block.timestamp, - "Shwotime::buyTickets: EXPIRED" - ); - require( - _tickets.max >= _tickets.sold, - "Shwotime::buyTickets: SOLD_OUT" - ); - - bool _transferFundsFromMsgSender = true; - for (uint256 _i = 0; _i < addresses.length; _i++) { - address _address = addresses[_i]; - if (!_tickets.committed[_address]) - _transferFundsFromMsgSender = false; - if (_tickets.paid[_address]) continue; - // Nest once. - bool _transferFundsFromDependency = true; - for ( - uint256 _j = 0; - _j < _tickets.dependencies[_address].length; - _j++ - ) { - address _subAddress = _tickets.dependencies[_address][_j]; - if ( - _subAddress != msg.sender && - !_tickets.committed[_subAddress] - ) _transferFundsFromDependency = false; - } - if (_transferFundsFromDependency) { - // Transfer money from the committed buyer to this contract. - dai.safeTransferFrom(_address, address(this), _tickets.price); - _tickets.paid[_address] = true; - _tickets.sold++; - } - } - if (_transferFundsFromMsgSender) { - // Transfer money from the msg sender to this contract. - dai.safeTransferFrom(msg.sender, address(this), _tickets.price); - //save the fact that msg.sender owes - _tickets.paid[msg.sender] = true; - _tickets.sold++; - } - - // Check to see if its sold out once everyone has been given tickets. - require( - _tickets.max >= _tickets.sold, - "Shwotime::buyTickets: SOLD_OUT" - ); - - _tickets.committed[msg.sender] = true; - } - - //Allow a ticket owner to collect funds once the tickets expire. - function collect(uint256 _id, string calldata _memo) external { - require(_id > 0 && _id <= ticketsCount, "Shwotime::collect: NOT_FOUND"); - - Tix storage _tickets = tickets[_id]; - - require( - msg.sender == _tickets.owner, - "Shwotime::collect: UNAUTHORIZED" - ); - - require( - _tickets.expiry <= block.timestamp, - "Shwotime::collect: TOO_SOON" - ); - - uint256 _total = _tickets.price * _tickets.sold; - uint256 _collectable = PRBMath.mulDiv(_total, 200 - fee, 200); - dai.safeTransfer(msg.sender, _collectable); - //Take your fee into Juicebox. - _takeFee(_total - _collectable, msg.sender, _memo, false); - } -} diff --git a/packages/hardhat/contracts/examples/YourContract.sol b/packages/hardhat/contracts/examples/YourContract.sol deleted file mode 100644 index 2e39d487d0..0000000000 --- a/packages/hardhat/contracts/examples/YourContract.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "../abstract/JuiceboxProject.sol"; - -/// @dev This contract is an example of how you can use Juicebox to fund your own project. -contract YourContract is JuiceboxProject { - constructor(uint256 _projectId, ITerminalDirectory _directory) - JuiceboxProject(_projectId, _directory) - {} -} diff --git a/packages/hardhat/contracts/interfaces/IDirectPaymentAddress.sol b/packages/hardhat/contracts/interfaces/IDirectPaymentAddress.sol deleted file mode 100644 index bde9425587..0000000000 --- a/packages/hardhat/contracts/interfaces/IDirectPaymentAddress.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalDirectory.sol"; -import "./ITerminal.sol"; - -interface IDirectPaymentAddress { - event Forward( - address indexed payer, - uint256 indexed projectId, - address beneficiary, - uint256 value, - string memo, - bool preferUnstakedTickets - ); - - function terminalDirectory() external returns (ITerminalDirectory); - - function projectId() external returns (uint256); - - function memo() external returns (string memory); -} diff --git a/packages/hardhat/contracts/interfaces/IFundingCycleBallot.sol b/packages/hardhat/contracts/interfaces/IFundingCycleBallot.sol deleted file mode 100644 index 420093b4fc..0000000000 --- a/packages/hardhat/contracts/interfaces/IFundingCycleBallot.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalV1.sol"; - -enum BallotState { - Approved, - Active, - Failed, - Standby -} - -interface IFundingCycleBallot { - function duration() external view returns (uint256); - - function state(uint256 _fundingCycleId, uint256 _configured) - external - view - returns (BallotState); -} diff --git a/packages/hardhat/contracts/interfaces/IFundingCycles.sol b/packages/hardhat/contracts/interfaces/IFundingCycles.sol deleted file mode 100644 index 1bababde70..0000000000 --- a/packages/hardhat/contracts/interfaces/IFundingCycles.sol +++ /dev/null @@ -1,119 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./IPrices.sol"; -import "./IProjects.sol"; -import "./IFundingCycleBallot.sol"; - -/// @notice The funding cycle structure represents a project stewarded by an address, and accounts for which addresses have helped sustain the project. -struct FundingCycle { - // A unique number that's incremented for each new funding cycle, starting with 1. - uint256 id; - // The ID of the project contract that this funding cycle belongs to. - uint256 projectId; - // The number of this funding cycle for the project. - uint256 number; - // The ID of a previous funding cycle that this one is based on. - uint256 basedOn; - // The time when this funding cycle was last configured. - uint256 configured; - // The number of cycles that this configuration should last for before going back to the last permanent. - uint256 cycleLimit; - // A number determining the amount of redistribution shares this funding cycle will issue to each sustainer. - uint256 weight; - // The ballot contract to use to determine a subsequent funding cycle's reconfiguration status. - IFundingCycleBallot ballot; - // The time when this funding cycle will become active. - uint256 start; - // The number of seconds until this funding cycle's surplus is redistributed. - uint256 duration; - // The amount that this funding cycle is targeting in terms of the currency. - uint256 target; - // The currency that the target is measured in. - uint256 currency; - // The percentage of each payment to send as a fee to the Juicebox admin. - uint256 fee; - // A percentage indicating how much more weight to give a funding cycle compared to its predecessor. - uint256 discountRate; - // The amount of available funds that have been tapped by the project in terms of the currency. - uint256 tapped; - // A packed list of extra data. The first 8 bytes are reserved for versioning. - uint256 metadata; -} - -struct FundingCycleProperties { - uint256 target; - uint256 currency; - uint256 duration; - uint256 cycleLimit; - uint256 discountRate; - IFundingCycleBallot ballot; -} - -interface IFundingCycles { - event Configure( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - uint256 reconfigured, - FundingCycleProperties _properties, - uint256 metadata, - address caller - ); - - event Tap( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - uint256 amount, - uint256 newTappedAmount, - address caller - ); - - event Init( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - uint256 number, - uint256 previous, - uint256 weight, - uint256 start - ); - - function latestIdOf(uint256 _projectId) external view returns (uint256); - - function count() external view returns (uint256); - - function BASE_WEIGHT() external view returns (uint256); - - function MAX_CYCLE_LIMIT() external view returns (uint256); - - function get(uint256 _fundingCycleId) - external - view - returns (FundingCycle memory); - - function queuedOf(uint256 _projectId) - external - view - returns (FundingCycle memory); - - function currentOf(uint256 _projectId) - external - view - returns (FundingCycle memory); - - function currentBallotStateOf(uint256 _projectId) - external - view - returns (BallotState); - - function configure( - uint256 _projectId, - FundingCycleProperties calldata _properties, - uint256 _metadata, - uint256 _fee, - bool _configureActiveFundingCycle - ) external returns (FundingCycle memory fundingCycle); - - function tap(uint256 _projectId, uint256 _amount) - external - returns (FundingCycle memory fundingCycle); -} diff --git a/packages/hardhat/contracts/interfaces/IModAllocator.sol b/packages/hardhat/contracts/interfaces/IModAllocator.sol deleted file mode 100644 index 198798a3da..0000000000 --- a/packages/hardhat/contracts/interfaces/IModAllocator.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -interface IModAllocator { - event Allocate( - uint256 indexed projectId, - uint256 indexed forProjectId, - address indexed beneficiary, - uint256 amount, - address caller - ); - - function allocate( - uint256 _projectId, - uint256 _forProjectId, - address _beneficiary - ) external payable; -} diff --git a/packages/hardhat/contracts/interfaces/IModStore.sol b/packages/hardhat/contracts/interfaces/IModStore.sol deleted file mode 100644 index 2747c01b51..0000000000 --- a/packages/hardhat/contracts/interfaces/IModStore.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./IOperatorStore.sol"; -import "./IProjects.sol"; -import "./IModAllocator.sol"; - -struct PayoutMod { - bool preferUnstaked; - uint16 percent; - uint48 lockedUntil; - address payable beneficiary; - IModAllocator allocator; - uint56 projectId; -} - -struct TicketMod { - bool preferUnstaked; - uint16 percent; - uint48 lockedUntil; - address payable beneficiary; -} - -interface IModStore { - event SetPayoutMod( - uint256 indexed projectId, - uint256 indexed configuration, - PayoutMod mods, - address caller - ); - - event SetTicketMod( - uint256 indexed projectId, - uint256 indexed configuration, - TicketMod mods, - address caller - ); - - function projects() external view returns (IProjects); - - function payoutModsOf(uint256 _projectId, uint256 _configuration) - external - view - returns (PayoutMod[] memory); - - function ticketModsOf(uint256 _projectId, uint256 _configuration) - external - view - returns (TicketMod[] memory); - - function setPayoutMods( - uint256 _projectId, - uint256 _configuration, - PayoutMod[] memory _mods - ) external; - - function setTicketMods( - uint256 _projectId, - uint256 _configuration, - TicketMod[] memory _mods - ) external; -} diff --git a/packages/hardhat/contracts/interfaces/IOperatable.sol b/packages/hardhat/contracts/interfaces/IOperatable.sol deleted file mode 100644 index dd4dce1b32..0000000000 --- a/packages/hardhat/contracts/interfaces/IOperatable.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./IOperatorStore.sol"; - -interface IOperatable { - function operatorStore() external view returns (IOperatorStore); -} diff --git a/packages/hardhat/contracts/interfaces/IOperatorStore.sol b/packages/hardhat/contracts/interfaces/IOperatorStore.sol deleted file mode 100644 index c1bd527144..0000000000 --- a/packages/hardhat/contracts/interfaces/IOperatorStore.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -interface IOperatorStore { - event SetOperator( - address indexed operator, - address indexed account, - uint256 indexed domain, - uint256[] permissionIndexes, - uint256 packed - ); - - function permissionsOf( - address _operator, - address _account, - uint256 _domain - ) external view returns (uint256); - - function hasPermission( - address _operator, - address _account, - uint256 _domain, - uint256 _permissionIndex - ) external view returns (bool); - - function hasPermissions( - address _operator, - address _account, - uint256 _domain, - uint256[] calldata _permissionIndexes - ) external view returns (bool); - - function setOperator( - address _operator, - uint256 _domain, - uint256[] calldata _permissionIndexes - ) external; - - function setOperators( - address[] calldata _operators, - uint256[] calldata _domains, - uint256[][] calldata _permissionIndexes - ) external; -} diff --git a/packages/hardhat/contracts/interfaces/IPrices.sol b/packages/hardhat/contracts/interfaces/IPrices.sol deleted file mode 100644 index 669a6bd0e8..0000000000 --- a/packages/hardhat/contracts/interfaces/IPrices.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; - -interface IPrices { - event AddFeed(uint256 indexed currency, AggregatorV3Interface indexed feed); - - function feedDecimalAdjuster(uint256 _currency) external returns (uint256); - - function targetDecimals() external returns (uint256); - - function feedFor(uint256 _currency) - external - returns (AggregatorV3Interface); - - function getETHPriceFor(uint256 _currency) external view returns (uint256); - - function addFeed(AggregatorV3Interface _priceFeed, uint256 _currency) - external; -} diff --git a/packages/hardhat/contracts/interfaces/IProjects.sol b/packages/hardhat/contracts/interfaces/IProjects.sol deleted file mode 100644 index a3875b1226..0000000000 --- a/packages/hardhat/contracts/interfaces/IProjects.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; - -import "./ITerminal.sol"; -import "./IOperatorStore.sol"; - -interface IProjects is IERC721 { - event Create( - uint256 indexed projectId, - address indexed owner, - bytes32 indexed handle, - string uri, - ITerminal terminal, - address caller - ); - - event SetHandle( - uint256 indexed projectId, - bytes32 indexed handle, - address caller - ); - - event SetUri(uint256 indexed projectId, string uri, address caller); - - event TransferHandle( - uint256 indexed projectId, - address indexed to, - bytes32 indexed handle, - bytes32 newHandle, - address caller - ); - - event ClaimHandle( - address indexed account, - uint256 indexed projectId, - bytes32 indexed handle, - address caller - ); - - event ChallengeHandle( - bytes32 indexed handle, - uint256 challengeExpiry, - address caller - ); - - event RenewHandle( - bytes32 indexed handle, - uint256 indexed projectId, - address caller - ); - - function count() external view returns (uint256); - - function uriOf(uint256 _projectId) external view returns (string memory); - - function handleOf(uint256 _projectId) external returns (bytes32 handle); - - function projectFor(bytes32 _handle) external returns (uint256 projectId); - - function transferAddressFor(bytes32 _handle) - external - returns (address receiver); - - function challengeExpiryOf(bytes32 _handle) external returns (uint256); - - function exists(uint256 _projectId) external view returns (bool); - - function create( - address _owner, - bytes32 _handle, - string calldata _uri, - ITerminal _terminal - ) external returns (uint256 id); - - function setHandle(uint256 _projectId, bytes32 _handle) external; - - function setUri(uint256 _projectId, string calldata _uri) external; - - function transferHandle( - uint256 _projectId, - address _to, - bytes32 _newHandle - ) external returns (bytes32 _handle); - - function claimHandle( - bytes32 _handle, - address _for, - uint256 _projectId - ) external; -} diff --git a/packages/hardhat/contracts/interfaces/IProxyPaymentAddress.sol b/packages/hardhat/contracts/interfaces/IProxyPaymentAddress.sol deleted file mode 100644 index 656117bce5..0000000000 --- a/packages/hardhat/contracts/interfaces/IProxyPaymentAddress.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalDirectory.sol"; -import "./ITicketBooth.sol"; - -interface IProxyPaymentAddress { - - event Receive( - address indexed caller, - uint256 value - ); - - event Tap( - address indexed caller, - uint256 value - ); - - event TransferTickets( - address indexed caller, - address indexed beneficiary, - uint256 indexed projectId, - uint256 amount - ); - - function terminalDirectory() external returns (ITerminalDirectory); - - function ticketBooth() external returns (ITicketBooth); - - function projectId() external returns (uint256); - - function memo() external returns (string memory); - - function tap() external; - - function transferTickets(address _beneficiary, uint256 _amount) external; - -} \ No newline at end of file diff --git a/packages/hardhat/contracts/interfaces/IProxyPaymentAddressManager.sol b/packages/hardhat/contracts/interfaces/IProxyPaymentAddressManager.sol deleted file mode 100644 index b608615109..0000000000 --- a/packages/hardhat/contracts/interfaces/IProxyPaymentAddressManager.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalDirectory.sol"; -import "./ITicketBooth.sol"; -import "./IProxyPaymentAddress.sol"; - -interface IProxyPaymentAddressManager { - - event Deploy( - uint256 indexed projectId, - string memo, - address indexed caller - ); - - function terminalDirectory() external returns (ITerminalDirectory); - - function ticketBooth() external returns (ITicketBooth); - - function addressesOf(uint256 _projectId) - external - view - returns (IProxyPaymentAddress[] memory); - - function deploy(uint256 _projectId, string memory _memo) external returns(address); - -} \ No newline at end of file diff --git a/packages/hardhat/contracts/interfaces/ITerminal.sol b/packages/hardhat/contracts/interfaces/ITerminal.sol deleted file mode 100644 index 380ae5b510..0000000000 --- a/packages/hardhat/contracts/interfaces/ITerminal.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalDirectory.sol"; - -interface ITerminal { - event Pay( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - address indexed beneficiary, - uint256 amount, - string note, - address caller - ); - - event AddToBalance( - uint256 indexed projectId, - uint256 value, - address caller - ); - - event AllowMigration(ITerminal allowed); - - event Migrate( - uint256 indexed projectId, - ITerminal indexed to, - uint256 _amount, - address caller - ); - - function terminalDirectory() external view returns (ITerminalDirectory); - - function migrationIsAllowed(ITerminal _terminal) - external - view - returns (bool); - - function pay( - uint256 _projectId, - address _beneficiary, - string calldata _memo, - bool _preferUnstakedTickets - ) external payable returns (uint256 fundingCycleId); - - function addToBalance(uint256 _projectId) external payable; - - function allowMigration(ITerminal _contract) external; - - function migrate(uint256 _projectId, ITerminal _to) external; -} diff --git a/packages/hardhat/contracts/interfaces/ITerminalDirectory.sol b/packages/hardhat/contracts/interfaces/ITerminalDirectory.sol deleted file mode 100644 index e988be9c8a..0000000000 --- a/packages/hardhat/contracts/interfaces/ITerminalDirectory.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./IDirectPaymentAddress.sol"; -import "./ITerminal.sol"; -import "./IProjects.sol"; -import "./IProjects.sol"; - -interface ITerminalDirectory { - event DeployAddress( - uint256 indexed projectId, - string memo, - address indexed caller - ); - - event SetTerminal( - uint256 indexed projectId, - ITerminal indexed terminal, - address caller - ); - - event SetPayerPreferences( - address indexed account, - address beneficiary, - bool preferUnstakedTickets - ); - - function projects() external view returns (IProjects); - - function terminalOf(uint256 _projectId) external view returns (ITerminal); - - function beneficiaryOf(address _account) external returns (address); - - function unstakedTicketsPreferenceOf(address _account) - external - returns (bool); - - function addressesOf(uint256 _projectId) - external - view - returns (IDirectPaymentAddress[] memory); - - function deployAddress(uint256 _projectId, string calldata _memo) external; - - function setTerminal(uint256 _projectId, ITerminal _terminal) external; - - function setPayerPreferences( - address _beneficiary, - bool _preferUnstakedTickets - ) external; -} diff --git a/packages/hardhat/contracts/interfaces/ITerminalUtility.sol b/packages/hardhat/contracts/interfaces/ITerminalUtility.sol deleted file mode 100644 index 691fda110c..0000000000 --- a/packages/hardhat/contracts/interfaces/ITerminalUtility.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./ITerminalDirectory.sol"; - -interface ITerminalUtility { - function terminalDirectory() external view returns (ITerminalDirectory); -} diff --git a/packages/hardhat/contracts/interfaces/ITerminalV1.sol b/packages/hardhat/contracts/interfaces/ITerminalV1.sol deleted file mode 100644 index 80d9f2e818..0000000000 --- a/packages/hardhat/contracts/interfaces/ITerminalV1.sol +++ /dev/null @@ -1,184 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; - -import "./ITicketBooth.sol"; -import "./IFundingCycles.sol"; -import "./IYielder.sol"; -import "./IProjects.sol"; -import "./IModStore.sol"; -import "./ITerminal.sol"; -import "./IOperatorStore.sol"; - -struct FundingCycleMetadata { - uint256 reservedRate; - uint256 bondingCurveRate; - uint256 reconfigurationBondingCurveRate; -} - -interface ITerminalV1 { - event Configure( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - address caller - ); - - event Tap( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - address indexed beneficiary, - uint256 amount, - uint256 currency, - uint256 netTransferAmount, - uint256 beneficiaryTransferAmount, - uint256 govFeeAmount, - address caller - ); - event Redeem( - address indexed holder, - address indexed beneficiary, - uint256 indexed _projectId, - uint256 amount, - uint256 returnAmount, - address caller - ); - - event PrintReserveTickets( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - address indexed beneficiary, - uint256 count, - uint256 beneficiaryTicketAmount, - address caller - ); - - event DistributeToPayoutMod( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - PayoutMod mod, - uint256 modCut, - address caller - ); - event DistributeToTicketMod( - uint256 indexed fundingCycleId, - uint256 indexed projectId, - TicketMod mod, - uint256 modCut, - address caller - ); - event AppointGovernance(address governance); - - event AcceptGovernance(address governance); - - event PrintPreminedTickets( - uint256 indexed projectId, - address indexed beneficiary, - uint256 amount, - uint256 currency, - string memo, - address caller - ); - - event Deposit(uint256 amount); - - event EnsureTargetLocalWei(uint256 target); - - event SetYielder(IYielder newYielder); - - event SetFee(uint256 _amount); - - event SetTargetLocalWei(uint256 amount); - - function governance() external view returns (address payable); - - function pendingGovernance() external view returns (address payable); - - function projects() external view returns (IProjects); - - function fundingCycles() external view returns (IFundingCycles); - - function ticketBooth() external view returns (ITicketBooth); - - function prices() external view returns (IPrices); - - function modStore() external view returns (IModStore); - - function reservedTicketBalanceOf(uint256 _projectId, uint256 _reservedRate) - external - view - returns (uint256); - - function canPrintPreminedTickets(uint256 _projectId) - external - view - returns (bool); - - function balanceOf(uint256 _projectId) external view returns (uint256); - - function currentOverflowOf(uint256 _projectId) - external - view - returns (uint256); - - function claimableOverflowOf( - address _account, - uint256 _amount, - uint256 _projectId - ) external view returns (uint256); - - function fee() external view returns (uint256); - - function deploy( - address _owner, - bytes32 _handle, - string calldata _uri, - FundingCycleProperties calldata _properties, - FundingCycleMetadata calldata _metadata, - PayoutMod[] memory _payoutMods, - TicketMod[] memory _ticketMods - ) external; - - function configure( - uint256 _projectId, - FundingCycleProperties calldata _properties, - FundingCycleMetadata calldata _metadata, - PayoutMod[] memory _payoutMods, - TicketMod[] memory _ticketMods - ) external returns (uint256); - - function printPreminedTickets( - uint256 _projectId, - uint256 _amount, - uint256 _currency, - address _beneficiary, - string memory _memo, - bool _preferUnstakedTickets - ) external; - - function tap( - uint256 _projectId, - uint256 _amount, - uint256 _currency, - uint256 _minReturnedWei - ) external returns (uint256); - - function redeem( - address _account, - uint256 _projectId, - uint256 _amount, - uint256 _minReturnedWei, - address payable _beneficiary, - bool _preferUnstaked - ) external returns (uint256 returnAmount); - - function printReservedTickets(uint256 _projectId) - external - returns (uint256 reservedTicketsToPrint); - - function setFee(uint256 _fee) external; - - function appointGovernance(address payable _pendingGovernance) external; - - function acceptGovernance() external; -} diff --git a/packages/hardhat/contracts/interfaces/ITicketBooth.sol b/packages/hardhat/contracts/interfaces/ITicketBooth.sol deleted file mode 100644 index 5d6f2ea1ca..0000000000 --- a/packages/hardhat/contracts/interfaces/ITicketBooth.sol +++ /dev/null @@ -1,151 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "./IProjects.sol"; -import "./IOperatorStore.sol"; -import "./ITickets.sol"; - -interface ITicketBooth { - event Issue( - uint256 indexed projectId, - string name, - string symbol, - address caller - ); - event Print( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - bool convertedTickets, - bool preferUnstakedTickets, - address controller - ); - - event Redeem( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - uint256 stakedTickets, - bool preferUnstaked, - address controller - ); - - event Stake( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - address caller - ); - - event Unstake( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - address caller - ); - - event Lock( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - address caller - ); - - event Unlock( - address indexed holder, - uint256 indexed projectId, - uint256 amount, - address caller - ); - - event Transfer( - address indexed holder, - uint256 indexed projectId, - address indexed recipient, - uint256 amount, - address caller - ); - - function ticketsOf(uint256 _projectId) external view returns (ITickets); - - function projects() external view returns (IProjects); - - function lockedBalanceOf(address _holder, uint256 _projectId) - external - view - returns (uint256); - - function lockedBalanceBy( - address _operator, - address _holder, - uint256 _projectId - ) external view returns (uint256); - - function stakedBalanceOf(address _holder, uint256 _projectId) - external - view - returns (uint256); - - function stakedTotalSupplyOf(uint256 _projectId) - external - view - returns (uint256); - - function totalSupplyOf(uint256 _projectId) external view returns (uint256); - - function balanceOf(address _holder, uint256 _projectId) - external - view - returns (uint256 _result); - - function issue( - uint256 _projectId, - string calldata _name, - string calldata _symbol - ) external; - - function print( - address _holder, - uint256 _projectId, - uint256 _amount, - bool _preferUnstakedTickets - ) external; - - function redeem( - address _holder, - uint256 _projectId, - uint256 _amount, - bool _preferUnstaked - ) external; - - function stake( - address _holder, - uint256 _projectId, - uint256 _amount - ) external; - - function unstake( - address _holder, - uint256 _projectId, - uint256 _amount - ) external; - - function lock( - address _holder, - uint256 _projectId, - uint256 _amount - ) external; - - function unlock( - address _holder, - uint256 _projectId, - uint256 _amount - ) external; - - function transfer( - address _holder, - uint256 _projectId, - uint256 _amount, - address _recipient - ) external; -} diff --git a/packages/hardhat/contracts/interfaces/ITickets.sol b/packages/hardhat/contracts/interfaces/ITickets.sol deleted file mode 100644 index aa4d90c944..0000000000 --- a/packages/hardhat/contracts/interfaces/ITickets.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface ITickets is IERC20 { - function print(address _account, uint256 _amount) external; - - function redeem(address _account, uint256 _amount) external; -} diff --git a/packages/hardhat/contracts/interfaces/IWETH.sol b/packages/hardhat/contracts/interfaces/IWETH.sol deleted file mode 100644 index 4f5fcae10e..0000000000 --- a/packages/hardhat/contracts/interfaces/IWETH.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -interface IWETH { - function decimals() external view returns (uint256); - - function deposit() external payable; - - function withdraw(uint256 wad) external; - - event Deposit(address indexed dst, uint256 wad); - event Withdrawal(address indexed src, uint256 wad); -} diff --git a/packages/hardhat/contracts/interfaces/IYielder.sol b/packages/hardhat/contracts/interfaces/IYielder.sol deleted file mode 100644 index 9148b27ed3..0000000000 --- a/packages/hardhat/contracts/interfaces/IYielder.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -import "./ITerminalV1.sol"; - -// In constructure, give unlimited access for TerminalV1 to take money from this. -interface IYielder { - function deposited() external view returns (uint256); - - function getCurrentBalance() external view returns (uint256); - - function deposit() external payable; - - function withdraw(uint256 _amount, address payable _beneficiary) external; - - function withdrawAll(address payable _beneficiary) - external - returns (uint256); -} diff --git a/packages/hardhat/contracts/interfaces/IyVaultV2.sol b/packages/hardhat/contracts/interfaces/IyVaultV2.sol deleted file mode 100644 index 6b70efaf97..0000000000 --- a/packages/hardhat/contracts/interfaces/IyVaultV2.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface IyVaultV2 is IERC20 { - function token() external view returns (address); - - function deposit() external returns (uint256); - - function deposit(uint256) external returns (uint256); - - function deposit(uint256, address) external returns (uint256); - - function withdraw() external returns (uint256); - - function withdraw(uint256) external returns (uint256); - - function withdraw(uint256, address) external returns (uint256); - - function withdraw( - uint256, - address, - uint256 - ) external returns (uint256); - - function permit( - address, - address, - uint256, - uint256, - bytes32 - ) external view returns (bool); - - function pricePerShare() external view returns (uint256); - - function apiVersion() external view returns (string memory); - - function totalAssets() external view returns (uint256); - - function maxAvailableShares() external view returns (uint256); - - function debtOutstanding() external view returns (uint256); - - function debtOutstanding(address strategy) external view returns (uint256); - - function creditAvailable() external view returns (uint256); - - function creditAvailable(address strategy) external view returns (uint256); - - function availableDepositLimit() external view returns (uint256); - - function expectedReturn() external view returns (uint256); - - function expectedReturn(address strategy) external view returns (uint256); - - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint256); - - function balanceOf(address owner) external view override returns (uint256); - - function totalSupply() external view override returns (uint256); - - function governance() external view returns (address); - - function management() external view returns (address); - - function guardian() external view returns (address); - - function guestList() external view returns (address); - - function strategies(address) - external - view - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - uint256, - uint256, - uint256 - ); - - function withdrawalQueue(uint256) external view returns (address); - - function emergencyShutdown() external view returns (bool); - - function depositLimit() external view returns (uint256); - - function debtRatio() external view returns (uint256); - - function totalDebt() external view returns (uint256); - - function lastReport() external view returns (uint256); - - function activation() external view returns (uint256); - - function rewards() external view returns (address); - - function managementFee() external view returns (uint256); - - function performanceFee() external view returns (uint256); -} diff --git a/packages/hardhat/contracts/libraries/Operations.sol b/packages/hardhat/contracts/libraries/Operations.sol deleted file mode 100644 index 9f8b4e709c..0000000000 --- a/packages/hardhat/contracts/libraries/Operations.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.6; - -library Operations { - uint256 public constant Configure = 1; - uint256 public constant PrintPreminedTickets = 2; - uint256 public constant Redeem = 3; - uint256 public constant Migrate = 4; - uint256 public constant SetHandle = 5; - uint256 public constant SetUri = 6; - uint256 public constant ClaimHandle = 7; - uint256 public constant RenewHandle = 8; - uint256 public constant Issue = 9; - uint256 public constant Stake = 10; - uint256 public constant Unstake = 11; - uint256 public constant Transfer = 12; - uint256 public constant Lock = 13; - uint256 public constant SetPayoutMods = 14; - uint256 public constant SetTicketMods = 15; - uint256 public constant SetTerminal = 16; -} diff --git a/packages/hardhat/hardhat.config.js b/packages/hardhat/hardhat.config.js deleted file mode 100644 index cb9e1ab136..0000000000 --- a/packages/hardhat/hardhat.config.js +++ /dev/null @@ -1,403 +0,0 @@ -const { utils } = require("ethers"); -const fs = require("fs"); -const chalk = require("chalk"); -const dotenv = require("dotenv"); - -require("@nomiclabs/hardhat-etherscan"); -require("@nomiclabs/hardhat-waffle"); -require("hardhat-gas-reporter"); -require("./tasks/deploy"); - -dotenv.config(); - -const { isAddress, getAddress, formatUnits, parseUnits } = utils; - -// -// Select the network you want to deploy to here: -// -const defaultNetwork = "localhost"; - -function mnemonic() { - try { - return fs.readFileSync("./mnemonic.txt").toString().trim(); - } catch (e) { - if (defaultNetwork !== "localhost") { - console.log( - "☢️ WARNING: No mnemonic file created for a deploy account. Try `yarn run generate` and then `yarn run account`." - ); - } - } - return ""; -} - -const infuraId = "44bd54e5424e4d8eb5d5d47a41590d63"; - -module.exports = { - defaultNetwork, - networks: { - localhost: { - url: "http://localhost:8545", - }, - rinkeby: { - url: "https://rinkeby.infura.io/v3/" + infuraId, - accounts: { - mnemonic: mnemonic(), - }, - }, - mainnet: { - url: "https://mainnet.infura.io/v3/" + infuraId, - gasPrice: 50000000000, - accounts: { - mnemonic: mnemonic(), - }, - }, - ropsten: { - url: "https://ropsten.infura.io/v3/" + infuraId, - accounts: { - mnemonic: mnemonic(), - }, - }, - kovan: { - url: "https://kovan.infura.io/v3/" + infuraId, - accounts: { - mnemonic: mnemonic(), - }, - }, - goerli: { - url: "https://goerli.infura.io/v3/" + infuraId, - accounts: { - mnemonic: mnemonic(), - }, - }, - xdai: { - url: "https://dai.poa.network", - gasPrice: 1000000000, - accounts: { - mnemonic: mnemonic(), - }, - }, - }, - solidity: { - version: "0.8.6", - settings: { - optimizer: { - enabled: true, - // https://docs.soliditylang.org/en/v0.6.3/using-the-compiler.html - runs: 10000, - }, - }, - }, - mocha: { - bail: true, - timeout: 6000, - }, - gasReporter: { - currency: "USD", - // gasPrice: 21, - enabled: !!process.env.REPORT_GAS, - showTimeSpent: true, - }, - etherscan: { - apiKey: `${process.env.ETHERSCAN_API_KEY}`, - }, -}; - -const DEBUG = true; - -function debug(text) { - if (DEBUG) { - console.log(text); - } -} - -task("wallet", "Create a wallet (pk) link", async (_, { ethers }) => { - const randomWallet = ethers.Wallet.createRandom(); - const privateKey = randomWallet._signingKey().privateKey; - console.log("🔐 WALLET Generated as " + randomWallet.address + ""); - console.log("🔗 http://localhost:3000/pk#" + privateKey); -}); - -task("fundedwallet", "Create a wallet (pk) link and fund it with deployer?") - .addOptionalParam( - "amount", - "Amount of ETH to send to wallet after generating" - ) - .addOptionalParam("url", "URL to add pk to") - .setAction(async (taskArgs, { network, ethers }) => { - const randomWallet = ethers.Wallet.createRandom(); - const privateKey = randomWallet._signingKey().privateKey; - console.log("🔐 WALLET Generated as " + randomWallet.address + ""); - const url = taskArgs.url ? taskArgs.url : "http://localhost:3000"; - - let localDeployerMnemonic; - try { - localDeployerMnemonic = fs.readFileSync("./mnemonic.txt"); - localDeployerMnemonic = localDeployerMnemonic.toString().trim(); - } catch (e) { - /* do nothing - this file isn't always there */ - } - - const amount = taskArgs.amount ? taskArgs.amount : "1"; - const tx = { - to: randomWallet.address, - value: ethers.utils.parseEther(amount), - }; - - // SEND USING LOCAL DEPLOYER MNEMONIC IF THERE IS ONE - // IF NOT SEND USING LOCAL HARDHAT NODE: - if (localDeployerMnemonic) { - let deployerWallet = new ethers.Wallet.fromMnemonic( - localDeployerMnemonic - ); - deployerWallet = deployerWallet.connect(ethers.provider); - console.log( - "💵 Sending " + - amount + - " ETH to " + - randomWallet.address + - " using deployer account: " + - deployerWallet.address - ); - const sendresult = await deployerWallet.sendTransaction(tx); - console.log("\n" + url + "/pk#" + privateKey + "\n"); - } else { - console.log( - "💵 Sending " + - amount + - " ETH to " + - randomWallet.address + - " using local node" - ); - console.log("\n" + url + "/pk#" + privateKey + "\n"); - return send(ethers.provider.getSigner(), tx); - } - }); - -task( - "generate", - "Create a mnemonic for builder deploys", - async (_, { ethers }) => { - const bip39 = require("bip39"); - const hdkey = require("ethereumjs-wallet/hdkey"); - const mnemonic = bip39.generateMnemonic(); - if (DEBUG) console.log("mnemonic", mnemonic); - const seed = await bip39.mnemonicToSeed(mnemonic); - if (DEBUG) console.log("seed", seed); - const hdwallet = hdkey.fromMasterSeed(seed); - const wallet_hdpath = "m/44'/60'/0'/0/"; - const account_index = 0; - const fullPath = wallet_hdpath + account_index; - if (DEBUG) console.log("fullPath", fullPath); - const wallet = hdwallet.derivePath(fullPath).getWallet(); - const privateKey = "0x" + wallet._privKey.toString("hex"); - if (DEBUG) console.log("privateKey", privateKey); - const EthUtil = require("ethereumjs-util"); - const address = - "0x" + EthUtil.privateToAddress(wallet._privKey).toString("hex"); - console.log( - "🔐 Account Generated as " + - address + - " and set as mnemonic in packages/hardhat" - ); - console.log( - "💬 Use 'yarn run account' to get more information about the deployment account." - ); - - fs.writeFileSync("./" + address + ".txt", mnemonic.toString()); - fs.writeFileSync("./mnemonic.txt", mnemonic.toString()); - } -); - -task("mine", "Looks for a deployer account that will give leading zeros") - .addParam("searchFor", "String to search for") - .setAction(async (taskArgs, { network, ethers }) => { - let contract_address = ""; - let address; - - const bip39 = require("bip39"); - const hdkey = require("ethereumjs-wallet/hdkey"); - - let mnemonic = ""; - while (contract_address.indexOf(taskArgs.searchFor) != 0) { - mnemonic = bip39.generateMnemonic(); - if (DEBUG) console.log("mnemonic", mnemonic); - const seed = await bip39.mnemonicToSeed(mnemonic); - if (DEBUG) console.log("seed", seed); - const hdwallet = hdkey.fromMasterSeed(seed); - const wallet_hdpath = "m/44'/60'/0'/0/"; - const account_index = 0; - const fullPath = wallet_hdpath + account_index; - if (DEBUG) console.log("fullPath", fullPath); - const wallet = hdwallet.derivePath(fullPath).getWallet(); - const privateKey = "0x" + wallet._privKey.toString("hex"); - if (DEBUG) console.log("privateKey", privateKey); - const EthUtil = require("ethereumjs-util"); - address = - "0x" + EthUtil.privateToAddress(wallet._privKey).toString("hex"); - - const rlp = require("rlp"); - const keccak = require("keccak"); - - const nonce = 0x00; // The nonce must be a hex literal! - const sender = address; - - const input_arr = [sender, nonce]; - const rlp_encoded = rlp.encode(input_arr); - - const contract_address_long = keccak("keccak256") - .update(rlp_encoded) - .digest("hex"); - - contract_address = contract_address_long.substring(24); // Trim the first 24 characters. - } - - console.log( - "⛏ Account Mined as " + - address + - " and set as mnemonic in packages/hardhat" - ); - console.log( - "📜 This will create the first contract: " + - chalk.magenta("0x" + contract_address) - ); - console.log( - "💬 Use 'yarn run account' to get more information about the deployment account." - ); - - fs.writeFileSync( - "./" + address + "_produces" + contract_address + ".txt", - mnemonic.toString() - ); - fs.writeFileSync("./mnemonic.txt", mnemonic.toString()); - }); - -task( - "account", - "Get balance informations for the deployment account.", - async (_, { ethers }) => { - const hdkey = require("ethereumjs-wallet/hdkey"); - const bip39 = require("bip39"); - const mnemonic = fs.readFileSync("./mnemonic.txt").toString().trim(); - if (DEBUG) console.log("mnemonic", mnemonic); - const seed = await bip39.mnemonicToSeed(mnemonic); - if (DEBUG) console.log("seed", seed); - const hdwallet = hdkey.fromMasterSeed(seed); - const wallet_hdpath = "m/44'/60'/0'/0/"; - const account_index = 0; - const fullPath = wallet_hdpath + account_index; - if (DEBUG) console.log("fullPath", fullPath); - const wallet = hdwallet.derivePath(fullPath).getWallet(); - const privateKey = "0x" + wallet._privKey.toString("hex"); - if (DEBUG) console.log("privateKey", privateKey); - const EthUtil = require("ethereumjs-util"); - const address = - "0x" + EthUtil.privateToAddress(wallet._privKey).toString("hex"); - - const qrcode = require("qrcode-terminal"); - qrcode.generate(address); - console.log("‍📬 Deployer Account is " + address); - for (const n in config.networks) { - // console.log(config.networks[n],n) - try { - const provider = new ethers.providers.JsonRpcProvider( - config.networks[n].url - ); - const balance = await provider.getBalance(address); - console.log(" -- " + n + " -- -- -- 📡 "); - console.log(" balance: " + ethers.utils.formatEther(balance)); - console.log( - " nonce: " + (await provider.getTransactionCount(address)) - ); - } catch (e) { - if (DEBUG) { - console.log(e); - } - } - } - } -); - -async function addr(ethers, addr) { - if (isAddress(addr)) { - return getAddress(addr); - } - const accounts = await ethers.provider.listAccounts(); - if (accounts[addr] !== undefined) { - return accounts[addr]; - } - throw Error(`Could not normalize address: ${addr}`); -} - -task("accounts", "Prints the list of accounts", async (_, { ethers }) => { - const accounts = await ethers.provider.listAccounts(); - accounts.forEach((account) => console.log(account)); -}); - -task("blockNumber", "Prints the block number", async (_, { ethers }) => { - const blockNumber = await ethers.provider.getBlockNumber(); - console.log(blockNumber); -}); - -task("balance", "Prints an account's balance") - .addPositionalParam("account", "The account's address") - .setAction(async (taskArgs, { ethers }) => { - const balance = await ethers.provider.getBalance( - await addr(ethers, taskArgs.account) - ); - console.log(formatUnits(balance, "ether"), "ETH"); - }); - -function send(signer, txparams) { - return signer.sendTransaction(txparams, (error, transactionHash) => { - if (error) { - debug(`Error: ${error}`); - } - debug(`transactionHash: ${transactionHash}`); - // checkForReceipt(2, params, transactionHash, resolve) - }); -} - -task("send", "Send ETH") - .addParam("from", "From address or account index") - .addOptionalParam("to", "To address or account index") - .addOptionalParam("amount", "Amount to send in ether") - .addOptionalParam("data", "Data included in transaction") - .addOptionalParam("gasPrice", "Price you are willing to pay in gwei") - .addOptionalParam("gasLimit", "Limit of how much gas to spend") - - .setAction(async (taskArgs, { network, ethers }) => { - const from = await addr(ethers, taskArgs.from); - debug(`Normalized from address: ${from}`); - const fromSigner = await ethers.provider.getSigner(from); - - let to; - if (taskArgs.to) { - to = await addr(ethers, taskArgs.to); - debug(`Normalized to address: ${to}`); - } - - const txRequest = { - from: await fromSigner.getAddress(), - to, - value: parseUnits( - taskArgs.amount ? taskArgs.amount : "0", - "ether" - ).toHexString(), - nonce: await fromSigner.getTransactionCount(), - gasPrice: parseUnits( - taskArgs.gasPrice ? taskArgs.gasPrice : "1.001", - "gwei" - ).toHexString(), - gasLimit: taskArgs.gasLimit ? taskArgs.gasLimit : 24000, - chainId: network.config.chainId, - }; - - if (taskArgs.data !== undefined) { - txRequest.data = taskArgs.data; - debug(`Adding data to payload: ${txRequest.data}`); - } - debug(txRequest.gasPrice / 1000000000 + " gwei"); - debug(JSON.stringify(txRequest, null, 2)); - - return send(fromSigner, txRequest); - }); diff --git a/packages/hardhat/package.json b/packages/hardhat/package.json deleted file mode 100644 index 967fc94878..0000000000 --- a/packages/hardhat/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "@jbox/sol", - "version": "1.0.2", - "author": { - "name": "Jango de la Noche" - }, - "bugs": { - "url": "https://github.com/jbx-protocol/juicehouse/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/jbx-protocol/juicehouse/" - }, - "files": [ - "contracts/**/*.sol", - "!contracts/test/**/*.sol", - "!contracts/Example*.sol", - "!contracts/examples/*.sol" - ], - "license": "MIT", - "devDependencies": { - "@ethereum-waffle/mock-contract": "^3.2.2", - "@gnosis.pm/mock-contract": "^4.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-waffle": "^2.0.0", - "chai": "^4.2.0", - "chalk": "^4.1.0", - "eslint": "^7.5.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-prettier": "^3.1.4", - "ethereum-waffle": "^3.1.1", - "ethers": "^5.1.0", - "hardhat": "^2.3.0", - "hardhat-gas-reporter": "^1.0.4", - "moment": "^2.29.1", - "node-watch": "^0.7.0", - "qrcode-terminal": "^0.12.0", - "ramda": "^0.27.1" - }, - "dependencies": { - "@chainlink/contracts": "^0.1.6", - "@nomiclabs/hardhat-etherscan": "^2.1.4", - "@openzeppelin/contracts": "^4.1.0", - "@paulrberg/contracts": "^3.4.0" - }, - "homepage": "https://github.com/jbx-protocol/juicehouse", - "keywords": [ - "blockchain", - "erc20", - "erc721", - "dao", - "nft", - "ethereum", - "library", - "smart-contracts", - "solidity" - ], - "publishConfig": { - "access": "public" - }, - "scripts": { - "chain": "hardhat node", - "test": "hardhat test --network localhost", - "test:gas": "REPORT_GAS=true hardhat test --network localhost", - "test:unit": "mocha --grep \"Unit\" --bail", - "test:integration": "mocha --grep \"Integration\" --bail", - "clean": "rimraf ./cache && rimraf ./artifacts", - "compile-force": "yarn clean && __DANGEROUS_OVM_IGNORE_ERRORS__=true hardhat compile", - "compile": "yarn clean && hardhat compile", - "deploy-local": "hardhat run scripts/deployAll.js --network localhost", - "deploy-OElocal": "hardhat run scripts/deployAll.js --network OElocalhost", - "deploy-ropsten": "hardhat run scripts/deployAll.js --network ropsten", - "deploy-kovan": "hardhat run scripts/deployAll.js --network kovan", - "deploy-OEkovan": "hardhat run scripts/deployAll.js --network OEkovan", - "deploy-rinkeby": "hardhat run scripts/deployAll.js --network rinkeby", - "deploy-mainnet": "hardhat run scripts/deployAll.js --network mainnet", - "hardhat-publish": "hardhat run scripts/publish.js", - "watch": "node scripts/watch.js", - "accounts": "hardhat accounts", - "account": "hardhat account", - "balance": "hardhat balance", - "send": "hardhat send", - "generate": "hardhat generate" - } -} diff --git a/packages/hardhat/scripts/deployAll.js b/packages/hardhat/scripts/deployAll.js deleted file mode 100644 index 6fd24ac1d7..0000000000 --- a/packages/hardhat/scripts/deployAll.js +++ /dev/null @@ -1,151 +0,0 @@ -/* eslint no-use-before-define: "warn" */ -const { ethers } = require("hardhat"); -const chalk = require("chalk"); -const fs = require("fs"); -const { utils } = require("ethers"); -const R = require("ramda"); -const ethUsdPriceFeed = require("../constants/eth_usd_price_feed"); -const publish = require("./publish"); -const juice = require("./utils"); - -/* eslint no-use-before-define: "warn" */ - -const network = process.env.HARDHAT_NETWORK; - -const main = async () => { - const startBlock = await ethers.provider.getBlockNumber(); - - console.log("Start block:", startBlock); - - const ethUsdAddr = ethUsdPriceFeed(network); - const prices = await juice.deploy("Prices"); - const operatorStore = await juice.deploy("OperatorStore"); - const projects = await juice.deploy("Projects", [operatorStore.address]); - const terminalDirectory = await juice.deploy("TerminalDirectory", [ - projects.address, - operatorStore.address, - ]); - const fundingCycles = await juice.deploy("FundingCycles", [ - terminalDirectory.address, - ]); - const ticketBooth = await juice.deploy("TicketBooth", [ - projects.address, - operatorStore.address, - terminalDirectory.address, - ]); - const modStore = await juice.deploy("ModStore", [ - projects.address, - operatorStore.address, - terminalDirectory.address, - ]); - await juice.deploy("ProxyPaymentAddressManager", [ - terminalDirectory.address, - ticketBooth.address, - ]); - await juice.deploy("TokenRepresentationProxy", [ - ticketBooth.address, - 1, - "JBX Proxy", - "JBXPROXY", - ]); - - const governance = await juice.deploy("Governance", [ - 1, - terminalDirectory.address, - ]); - - const terminalV1 = await juice.deploy("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address, - governance.address, - ]); - - const ballot = await juice.deploy("Active7DaysFundingCycleBallot", []); - - const PricesFactory = await ethers.getContractFactory("Prices"); - const GovernanceFactory = await ethers.getContractFactory("Governance"); - const TerminalV1Factory = await ethers.getContractFactory("TerminalV1"); - - const attachedPrices = await PricesFactory.attach(prices.address); - const attachedGovernance = await GovernanceFactory.attach(governance.address); - const attachedTerminalV1 = await TerminalV1Factory.attach(terminalV1.address); - - const callContractIcon = "🛰 "; - console.log(callContractIcon + "Setting the prices owner"); - await attachedPrices.transferOwnership(governance.address); - - // Add a production price feed if there is a reference to one. - if (ethUsdAddr) { - console.log( - callContractIcon + "Adding ETH/USD price feed to the funding cycles" - ); - await attachedGovernance.addPriceFeed(prices.address, ethUsdAddr, 1, { - gasLimit: 6000000, - }); - // Otherwise deploy a static local price feed. - } else { - const feed = await juice.deploy("ExampleETHUSDPriceFeed", []); - await attachedGovernance.addPriceFeed(prices.address, feed.address, 1); - } - - console.log( - callContractIcon + "Transfering ownership of governance to the multisig" - ); - - // Transfer ownership of governance to the multisig. - await attachedGovernance.transferOwnership(juice.multisigAddress); - - console.log(callContractIcon + "Configuring governance's budget"); - - await attachedTerminalV1.deploy( - governance.address, - utils.formatBytes32String("juicebox"), - "QmQTsEPAx1caPL5n6QQyngpBR7GdCQZFeh8z15idAYo9hr", - { - target: "0x43A69CA064CD09C0000", - currency: 1, - duration: 30, // 30 days - cycleLimit: 0, - discountRate: 200, - ballot: ballot.address, - }, - { - bondingCurveRate: 120, - reservedRate: 20, - reconfigurationBondingCurveRate: 120, - }, - [], - [], - { - gasLimit: 6000000, - } - ); - - console.log("\n"); - - console.log( - "⚡️ All contract artifacts saved to:", - chalk.yellow("packages/hardhat/artifacts/"), - "\n" - ); - - console.log( - chalk.green(" ✔ Deployed for network:"), - process.env.HARDHAT_NETWORK, - "\n" - ); - - await publish(startBlock); -}; - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/packages/hardhat/scripts/deployProxyPaymentAddressManager.js b/packages/hardhat/scripts/deployProxyPaymentAddressManager.js deleted file mode 100644 index 3b36c05d17..0000000000 --- a/packages/hardhat/scripts/deployProxyPaymentAddressManager.js +++ /dev/null @@ -1,68 +0,0 @@ -// Script to deploy ProxyAddressManager to mainnet. -// -// Usage: -// cd packages/hardhat -// npx hardhat run scripts/deployProxyPaymentAddressManager.js --network mainnet - -/* eslint no-use-before-define: "warn" */ -const chalk = require("chalk"); -const publish = require("./publish"); -const juice = require("./utils"); - -/* eslint no-use-before-define: "warn" */ - -const network = process.env.HARDHAT_NETWORK; - -const getTerminalDirectory = () => { - if (network === "rinkeby") { - return "0x5d03dA1Ec58cf319c4fDbf2E3fE3DDcd887ef9aD"; - } - if (network === "mainnet") { - return "0x46C9999A2EDCD5aA177ed7E8af90c68b7d75Ba46"; - } -}; - -const getTicketBooth = () => { - if (network === "rinkeby") { - return "0x04f228B6654253c63DBcE4c60391a8eF3c43c861"; - } - if (network === "mainnet") { - return "0xee2eBCcB7CDb34a8A822b589F9E8427C24351bfc"; - } -}; - -const main = async () => { - // TODO: this kind of logic could be generalized. - // We should be able to get a deployed address of a contract for a given network. - if (network !== "mainnet" && network !== "rinkeby") { - throw "⚠️ This script should only be used when deploying to mainnet or rinkeby"; - } - const startBlock = await ethers.provider.getBlockNumber(); - console.log("Start block:", startBlock); - console.log("Deploying:", chalk.yellow("ProxyPaymentAddressManager"), "\n"); - - const terminalDirectory = getTerminalDirectory(); - const ticketBooth = getTicketBooth(); - - console.log("TerminalDirectory:", chalk.green(terminalDirectory)); - console.log("TicketBooth:", chalk.green(ticketBooth), "\n"); - - await juice.deploy("ProxyPaymentAddressManager", [ - terminalDirectory, - ticketBooth, - ]); - console.log("\n"); - console.log( - "⚡️ Contract artifacts saved to:", - chalk.yellow("packages/hardhat/artifacts/"), - "\n" - ); - await publish(startBlock, "ProxyPaymentAddressManager"); -}; - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/packages/hardhat/scripts/publish.js b/packages/hardhat/scripts/publish.js deleted file mode 100644 index c35dc59ab6..0000000000 --- a/packages/hardhat/scripts/publish.js +++ /dev/null @@ -1,129 +0,0 @@ -const fs = require("fs"); -const chalk = require("chalk"); -const bre = require("hardhat"); -const skipContracts = require("../constants/skip-publish"); - -const network = process.env.HARDHAT_NETWORK || ""; -const publishDir = "../app/src/contracts/" + network; -const graphDir = "../subgraph"; -const configFileName = network + ".json"; -const graphConfigPath = `${graphDir}/config/${configFileName}`; - -let graphConfig; - -// If contract name is empty, all contracts will be published. -module.exports = (startBlock, singleContractName) => - publish(startBlock, singleContractName) - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); - -async function publish(startBlock, singleContractName) { - console.log( - "Publishing artifacts to app and hardhat directories for network:", - chalk.bold(process.env.HARDHAT_NETWORK), - "...", - "\n" - ); - - try { - if (fs.existsSync(graphConfigPath)) { - graphConfig = fs.readFileSync(graphConfigPath).toString(); - } else { - graphConfig = "{}"; - } - } catch (e) { - console.log(e); - } - - console.log( - "🗺 Creating subgraph config at", - chalk.yellow(graphConfigPath), - "\n" - ); - - graphConfig = JSON.parse(graphConfig); - - // local subgraph requires network name of 'mainnet' - graphConfig.Network = network === "localhost" ? "mainnet" : network; - graphConfig.AbisDir = network; - graphConfig.StartBlock = parseInt(startBlock); - - if (!fs.existsSync(publishDir)) { - fs.mkdirSync(publishDir); - } - const finalContractList = []; - fs.readdirSync(bre.config.paths.sources).forEach((file) => { - if ( - (singleContractName && file.indexOf(`${singleContractName}.sol`) >= 0) || - (!singleContractName && file.indexOf(`.sol`) >= 0) - ) { - const contractName = file.replace(".sol", ""); - // Add contract to list if publishing is successful - if (publishContract(contractName)) finalContractList.push(contractName); - } - }); - fs.writeFileSync( - `${publishDir}/contracts.js`, - `module.exports = ${JSON.stringify(finalContractList)};` - ); - - console.log(chalk.green(" ✔ Published for network:"), network, "\n"); -} - -function publishContract(contractName) { - if (skipContracts.includes(contractName)) { - console.log("➖ Skipping contract:", chalk.cyan(contractName)); - return; - } - - console.log( - "⚡️ Saving", - chalk.cyan(contractName), - "artifacts to", - chalk.yellow(publishDir) - ); - - try { - let contract = fs - .readFileSync( - `${bre.config.paths.artifacts}/contracts/${contractName}.sol/${contractName}.json` - ) - .toString(); - const address = fs - .readFileSync(`${bre.config.paths.artifacts}/${contractName}.address`) - .toString(); - contract = JSON.parse(contract); - - graphConfig[contractName + "Address"] = address; - - fs.writeFileSync( - `${publishDir}/${contractName}.address.js`, - `module.exports = "${address}";` - ); - fs.writeFileSync( - `${publishDir}/${contractName}.abi.js`, - `module.exports = ${JSON.stringify(contract.abi, null, 2)};` - ); - fs.writeFileSync( - `${publishDir}/${contractName}.bytecode.js`, - `module.exports = "${contract.bytecode}";` - ); - - const folderPath = graphConfigPath.replace(configFileName, ""); - if (!fs.existsSync(folderPath)) fs.mkdirSync(folderPath); - fs.writeFileSync(graphConfigPath, JSON.stringify(graphConfig, null, 2)); - - const configDir = `${graphDir}/abis/${network}`; - const configFilePath = `${configDir}/${contractName}.json`; - if (!fs.existsSync(configDir)) fs.mkdirSync(configDir); - fs.writeFileSync(configFilePath, JSON.stringify(contract.abi, null, 2)); - - return true; - } catch (e) { - console.log(e); - return false; - } -} diff --git a/packages/hardhat/scripts/utils.js b/packages/hardhat/scripts/utils.js deleted file mode 100644 index 7721c8cc03..0000000000 --- a/packages/hardhat/scripts/utils.js +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint no-use-before-define: "warn" */ -const fs = require("fs"); -const chalk = require("chalk"); -const { utils } = require("ethers"); -const R = require("ramda"); -const { JsonRpcProvider } = require("@ethersproject/providers"); - -// abi encodes contract arguments -// useful when you want to manually verify the contracts -// for example, on Etherscan -const abiEncodeArgs = (deployed, contractArgs) => { - // not writing abi encoded args if this does not pass - if ( - !contractArgs || - !deployed || - !R.hasPath(["interface", "deploy"], deployed) - ) { - return ""; - } - const encoded = utils.defaultAbiCoder.encode( - deployed.interface.deploy.inputs, - contractArgs - ); - return encoded; -}; - -const deploy = async (contractName, _args) => { - console.log("🚀", chalk.cyan(contractName), "deploying..."); - - const contractArgs = _args || []; - const contractArtifacts = await ethers.getContractFactory(contractName); - const deployed = await contractArtifacts.deploy(...contractArgs); - await deployed.deployTransaction.wait(); - - const encoded = abiEncodeArgs(deployed, contractArgs); - fs.writeFileSync(`artifacts/${contractName}.address`, deployed.address); - - console.log( - chalk.green(" Done!"), - "Deployed at:", - chalk.magenta(deployed.address) - ); - - if (!encoded || encoded.length <= 2) return deployed; - fs.writeFileSync(`artifacts/${contractName}.args`, encoded.slice(2)); - - return deployed; -}; - -exports.deploy = deploy; -exports.abiEncodeArgs = abiEncodeArgs; -exports.multisigAddress = "0xAF28bcB48C40dBC86f52D459A6562F658fc94B1e"; diff --git a/packages/hardhat/scripts/watch.js b/packages/hardhat/scripts/watch.js deleted file mode 100644 index 8f4c503490..0000000000 --- a/packages/hardhat/scripts/watch.js +++ /dev/null @@ -1,18 +0,0 @@ -const watch = require("node-watch"); -const { exec } = require("child_process"); - -const run = () => { - console.log("🛠 Compiling & Deploying..."); - exec("yarn deploy", function(error, stdout, stderr) { - console.log(stdout); - if (error) console.log(error); - if (stderr) console.log(stderr); - }); -}; - -console.log("🔬 Watching Contracts..."); -watch("./contracts", { recursive: true }, function(evt, name) { - console.log("%s changed.", name); - run(); -}); -run(); diff --git a/packages/hardhat/tasks/deploy.js b/packages/hardhat/tasks/deploy.js deleted file mode 100644 index 5d48b31a38..0000000000 --- a/packages/hardhat/tasks/deploy.js +++ /dev/null @@ -1,42 +0,0 @@ -const chalk = require("chalk"); - -const juice = require("../scripts/utils"); - -/** - * Deploys the TokenRepresentationProxy contract. - * - * Example usage: - * npx hardhat deployTokenRepresentationProxy \ - * --ticketbooth 0xee2eBCcB7CDb34a8A822b589F9E8427C24351bfc \ - * --projectid 0x01 \ - * --name "JBX Proxy" \ - * --ticker JBXPROXY \ - * --network rinkeby - */ -task( - "deployTokenRepresentationProxy", - "Deploys the TokenRepresentationProxy contract" -) - .addParam("ticketbooth", "TicketBooth address") - .addParam("projectid", "Project ID") - .addParam("name", "ERC20 token name") - .addParam("ticker", "ERC20 ticker symbol") - .setAction(async (taskArgs) => { - const contract = "TokenRepresentationProxy"; - console.log( - `Deploying `, - chalk.magenta(contract), - `with the following params: ` - ); - console.log("TicketBooth: ", chalk.green(taskArgs.ticketbooth)); - console.log("ProjectId: ", chalk.green(taskArgs.projectid)); - console.log("erc20Name: ", chalk.green(taskArgs.name)); - console.log("erc20Ticker: ", chalk.green(taskArgs.ticker)); - await juice.deploy(contract, [ - taskArgs.ticketbooth, - taskArgs.projectid, - taskArgs.name, - taskArgs.ticker, - ]); - console.log(`Successfully deployed `, chalk.magenta(contract)); - }); diff --git a/packages/hardhat/test/index.js b/packages/hardhat/test/index.js deleted file mode 100644 index f1d6efd324..0000000000 --- a/packages/hardhat/test/index.js +++ /dev/null @@ -1,377 +0,0 @@ -const { ethers, config } = require("hardhat"); -const chai = require("chai"); -const fs = require("fs"); - -const { deployMockContract } = require("@ethereum-waffle/mock-contract"); - -const { BigNumber, Contract } = require("ethers"); -const unit = require("./unit"); -const integration = require("./integration"); - -describe("Juicebox", async function () { - before(async function () { - // Bind a reference to the deployer address and an array of other addresses to `this`. - [this.deployer, ...this.addrs] = await ethers.getSigners(); - - // Bind the ability to manipulate time to `this`. - // Bind a function that gets the current block's timestamp. - this.getTimestampFn = async (block) => { - return ethers.BigNumber.from( - (await ethers.provider.getBlock(block || "latest")).timestamp - ); - }; - - // Binds a function that sets a time mark that is taken into account while fastforward. - this.setTimeMarkFn = async (blockNumber) => { - this.timeMark = await this.getTimestampFn(blockNumber); - }; - - // Binds a function that fastforward a certain amount from the beginning of the test, or from the latest time mark if one is set. - this.fastforwardFn = async (seconds) => { - const now = await this.getTimestampFn(); - const timeSinceTimemark = now.sub(this.timeMark); - const fastforwardAmount = seconds.toNumber() - timeSinceTimemark; - this.timeMark = now.add(fastforwardAmount); - - // Subtract away any time that has already passed between the start of the test, - // or from the last fastforward, from the provided value. - await ethers.provider.send("evm_increaseTime", [fastforwardAmount]); - // Mine a block. - await ethers.provider.send("evm_mine"); - }; - - // Bind a reference to a function that can deploy mock contracts from an abi. - this.deployMockContractFn = (abi) => deployMockContract(this.deployer, abi); - - // Bind a reference to a function that can deploy mock local contracts from names. - this.deployMockLocalContractFn = async (mockContractName) => { - // Deploy mock contracts. - const mockArtifacts = fs - .readFileSync( - `${config.paths.artifacts}/contracts/${mockContractName}.sol/${mockContractName}.json` - ) - .toString(); - - return this.deployMockContractFn(JSON.parse(mockArtifacts).abi); - }; - - // Bind a reference to a function that can deploy a contract on the local network. - this.deployContractFn = async (contractName, args = []) => { - const artifacts = await ethers.getContractFactory(contractName); - return artifacts.deploy(...args); - }; - - // Bind a function that mocks a contract function's execution with the provided args to return the provided values. - this.mockFn = async ({ mockContract, fn, args, returns = [] }) => { - // The `args` can be a function or an array. - const normalizedArgs = - args && typeof args === "function" ? await args() : args; - - // The `returns` value can be a function or an array. - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - - // Get a reference to the mock. - const mock = mockContract.mock[fn]; - - // If args were provided, make the the mock only works if invoked with the provided args. - if (normalizedArgs) mock.withArgs(...normalizedArgs); - - // Set its return value. - await mock.returns(...normalizedReturns); - }; - - // Bind a function that executes a transaction on a contract. - this.executeFn = async ({ - caller, - contract, - contractName, - contractAddress, - fn, - args = [], - value = 0, - events = [], - revert, - }) => { - // Args can be either a function or an array. - const normalizedArgs = typeof args === "function" ? await args() : args; - - let contractInternal; - if (contractName) { - if (contract) { - throw "You can only provide a contract name or contract object."; - } - if (!contractAddress) { - throw "You must provide a contract address with a contract name."; - } - const artifacts = fs - .readFileSync( - `${config.paths.artifacts}/contracts/${contractName}.sol/${contractName}.json` - ) - .toString(); - - contractInternal = new Contract( - contractAddress, - JSON.parse(artifacts).abi, - caller - ); - } else { - contractInternal = contract; - } - - // Save the promise that is returned. - const promise = contractInternal - .connect(caller) - [fn](...normalizedArgs, { value }); - - // If a revert message is passed in, check to see if it was thrown. - if (revert) { - await chai.expect(promise).to.be.revertedWith(revert); - return; - } - - // Await the promise. - const tx = await promise; - - // Wait for a block to get mined. - await tx.wait(); - - // Set the time mark of this function. - await this.setTimeMarkFn(tx.blockNumber); - - // Return if there are no events. - if (events.length === 0) return; - - // Check for events. - events.forEach((event) => - chai - .expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ); - }; - - this.bindContractFn = async ({ - address, - contractName, - signerOrProvider, - }) => { - const artifacts = fs - .readFileSync( - `${config.paths.artifacts}/contracts/${contractName}.sol/${contractName}.json` - ) - .toString(); - - return new Contract(address, JSON.parse(artifacts).abi, signerOrProvider); - }; - - // Bind a function that sends funds from one address to another. - this.sendTransactionFn = async ({ from, to, value, revert, events }) => { - // Transfer the funds. - const promise = from.sendTransaction({ - to, - value, - }); - - // If a revert message is passed in, check to see if it was thrown. - if (revert) { - await chai.expect(promise).to.be.revertedWith(revert); - return; - } - - // Await the promise. - const tx = await promise; - - // Wait for a block to get mined. - await tx.wait(); - - // Set the time mark of this function. - await this.setTimeMarkFn(tx.blockNumber); - - // Return if there are no events. - if (events.length === 0) return; - - // Check for events. - events.forEach((event) => - chai - .expect(tx) - .to.emit(event.contract, event.name) - .withArgs(...event.args) - ); - }; - - // Bind a function that checks if a contract getter equals an expected value. - this.checkFn = async ({ - caller, - contract, - fn, - args, - expect, - plusMinus, - }) => { - const storedVal = await contract.connect(caller)[fn](...args); - if (plusMinus) { - console.log({ - storedVal, - diff: storedVal.sub(expect), - plusMinus: plusMinus.amount, - }); - chai.expect(storedVal.lte(expect.add(plusMinus.amount))).to.equal(true); - chai.expect(storedVal.gte(expect.sub(plusMinus.amount))).to.equal(true); - } else { - chai.expect(storedVal).to.deep.equal(expect); - } - }; - - // Binds a function that makes sure the provided address has the balance - this.verifyBalanceFn = async ({ address, expect, plusMinus }) => { - const storedVal = await ethers.provider.getBalance(address); - if (plusMinus) { - console.log({ - storedVal, - diff: storedVal.sub(expect), - plusMinus: plusMinus.amount, - }); - chai.expect(storedVal.lte(expect.add(plusMinus.amount))).to.equal(true); - chai.expect(storedVal.gte(expect.sub(plusMinus.amount))).to.equal(true); - } else { - chai.expect(storedVal).to.deep.equal(expect); - } - }; - - // Binds a function that gets the balance of an address. - this.getBalanceFn = (address) => ethers.provider.getBalance(address); - - // Binds the standard expect function. - this.expectFn = chai.expect; - - // Bind some constants. - - this.constants = { - AddressZero: ethers.constants.AddressZero, - MaxUint256: ethers.constants.MaxUint256, - MaxInt256: ethers.BigNumber.from(2).pow(255).sub(1), - MaxUint24: ethers.BigNumber.from(2).pow(24).sub(1), - MaxUint16: ethers.BigNumber.from(2).pow(16).sub(1), - MaxUint8: ethers.BigNumber.from(2).pow(8).sub(1), - }; - - // Bind function that gets a random big number. - this.randomBigNumberFn = ({ - min = ethers.BigNumber.from(0), - max = this.constants.MaxUint256, - precision = 10000000, - favorEdges = true, - } = {}) => { - // To test an edge condition, return the min or the max and the numbers around them more often. - // Return the min or the max or the numbers around them 50% of the time. - if (favorEdges && Math.random() < 0.5) { - const r = Math.random(); - if (r <= 0.25 && min.add(1).lt(max)) return min.add(1); - if (r >= 0.75 && max.sub(1).gt(min)) return max.sub(1); - // return the min 50% of the time. - return r < 0.5 ? min : max; - } - - const base = max.sub(min); - const randomInRange = base.gt(precision) - ? base - .div(precision) - .mul(ethers.BigNumber.from(Math.floor(Math.random() * precision))) - : base - .mul(ethers.BigNumber.from(Math.floor(Math.random() * precision))) - .div(precision); - - return randomInRange.add(min); - }; - - // Bind a function that gets a random address. - this.randomAddressFn = ({ exclude = [] } = {}) => { - // To test an edge condition, pick the same address more likely than not. - // return address0 50% of the time. - const candidate = - Math.random() < 0.5 - ? this.addrs[0].address - : this.addrs[Math.floor(Math.random() * 9)].address; - if (exclude.includes(candidate)) return this.randomAddressFn({ exclude }); - - return candidate; - }; - - // Bind a function that gets a random signed. - this.randomSignerFn = ({ exclude = [] } = {}) => { - // To test an edge condition, pick the same address more likely than not. - // return address0 50% of the time. - const candidate = - Math.random() < 0.5 - ? this.addrs[0] - : this.addrs[Math.floor(Math.random() * 9)]; - if (exclude.includes(candidate.address)) - return this.randomSignerFn({ exclude }); - return candidate; - }; - - // Bind a function that returns either true or false randomly. - this.randomBoolFn = () => Math.random() > 0.5; - - // Bind a function that generates a random string. - this.randomStringFn = ({ - exclude = [], - prepend = "", - canBeEmpty = true, - favorEdges = true, - } = {}) => { - const seed = this.randomBigNumberFn({ - min: canBeEmpty ? BigNumber.from(0) : BigNumber.from(1), - favorEdges, - }); - const candidate = prepend.concat( - Math.random().toString(36).substr(2, seed) - ); - if (exclude.includes(candidate)) - return this.randomStringFn({ exclude, prepend, canBeEmpty }); - return candidate; - }; - - // Bind the big number utils. - this.BigNumber = ethers.BigNumber; - - // Bind a function that returns a random set of bytes. - this.randomBytesFn = ({ - min = BigNumber.from(10), - max = BigNumber.from(32), - prepend = "", - exclude = [], - } = {}) => { - const candidate = ethers.utils.formatBytes32String( - this.randomStringFn({ - prepend, - seed: this.randomBigNumberFn({ - min, - max, - }), - favorEdges: false, - }) - ); - if (exclude.includes(candidate)) - return this.randomBytesFn({ exclude, min, max, prepend }); - return candidate; - }; - - this.stringToBytes = ethers.utils.formatBytes32String; - - // Bind functions for cleaning state. - this.snapshotFn = () => ethers.provider.send("evm_snapshot", []); - this.restoreFn = (id) => ethers.provider.send("evm_revert", [id]); - }); - - // Before each test, take a snapshot of the contract state. - beforeEach(async function () { - // Make the start time of the test available. - this.testStart = await this.getTimestampFn(); - }); - - // Run the tests. - describe("Unit", unit); - describe("Integration", integration); -}); diff --git a/packages/hardhat/test/integration/index.js b/packages/hardhat/test/integration/index.js deleted file mode 100644 index 52a6a0228e..0000000000 --- a/packages/hardhat/test/integration/index.js +++ /dev/null @@ -1,276 +0,0 @@ -const { BigNumber, constants, utils } = require("ethers"); -const workflows = require("./workflows"); - -// The first project ID is used for governance. -let projectId = BigNumber.from(1); -// The first funding cycle ID is used for governance. -let fundingCycleId = BigNumber.from(1); - -let currency = BigNumber.from(0); - -const run = function (ops) { - return function () { - // eslint-disable-next-line no-restricted-syntax - for (const op of ops) { - it(op.description, async function () { - this.local = { - ...this.local, - // eslint-disable-next-line no-await-in-loop - ...(await op.fn(this)), - }; - }); - } - }; -}; - -module.exports = function () { - // Deploy all contracts. - before(async function () { - const operatorStore = await this.deployContractFn("OperatorStore"); - const projects = await this.deployContractFn("Projects", [ - operatorStore.address, - ]); - const prices = await this.deployContractFn("Prices"); - const terminalDirectory = await this.deployContractFn("TerminalDirectory", [ - projects.address, - operatorStore.address, - ]); - const fundingCycles = await this.deployContractFn("FundingCycles", [ - terminalDirectory.address, - ]); - - const ticketBooth = await this.deployContractFn("TicketBooth", [ - projects.address, - operatorStore.address, - terminalDirectory.address, - ]); - - const modStore = await this.deployContractFn("ModStore", [ - projects.address, - operatorStore.address, - terminalDirectory.address, - ]); - - const governance = await this.deployContractFn("Governance", [ - 1, - terminalDirectory.address, - ]); - - const terminalV1 = await this.deployContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address, - governance.address, - ]); - - const proxyPaymentAddressManager = await this.deployContractFn( - "ProxyPaymentAddressManager", - [terminalDirectory.address, ticketBooth.address] - ); - - // Set governance as the prices contract owner. - await prices.transferOwnership(governance.address); - /** - Deploy the governance contract's project. It will have an ID of 1. - */ - await this.executeFn({ - caller: this.deployer, - contract: terminalV1, - fn: "deploy", - args: [ - this.deployer.address, - utils.formatBytes32String("juicebox"), - "", - { - target: 0, - currency: 0, - // Duration must be zero so that the same cycle lasts throughout the tests. - duration: 0, - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(0), - ballot: constants.AddressZero, - }, - { - reservedRate: 0, - bondingCurveRate: 0, - reconfigurationBondingCurveRate: 0, - }, - [], - [], - ], - }); - - // Bind the contracts to give the wokflows access to them. - this.contracts = { - governance, - terminalDirectory, - prices, - operatorStore, - ticketBooth, - fundingCycles, - projects, - modStore, - terminalV1, - proxyPaymentAddressManager, - }; - - // The governance project should have an ID of 1. - this.constants.GovernanceProjectId = 1; - - // Bind the standard weight multiplier to the constants. - // This is used to determine how many tickets get printed per value contributed during a first funding cycle. - this.constants.InitialWeightMultiplier = ( - await fundingCycles.BASE_WEIGHT() - ).div(BigNumber.from(10).pow(18)); - - this.constants.MaxCycleLimit = await fundingCycles.MAX_CYCLE_LIMIT(); - - this.constants.GovernanceProjectId = projectId; - this.constants.GovenanceOwner = this.deployer.address; - - // All perecents are out of 200, except for mods. - this.constants.MaxPercent = BigNumber.from(200); - - // Mod percents are out of 10000. - this.constants.MaxModPercent = BigNumber.from(10000); - - // Discount rate percents are out of 201. sending 201 creates a non recurring funding cycle. - this.constants.MaxDiscountRate = BigNumber.from(201); - - // The denominator for discount rates is 1000, meaning only 80% - 100% are accessible. - this.constants.DiscountRatePercentDenominator = BigNumber.from(1000); - - this.incrementProjectIdFn = () => { - projectId = projectId.add(1); - return projectId; - }; - this.incrementFundingCycleIdFn = () => { - fundingCycleId = fundingCycleId.add(1); - return fundingCycleId; - }; - - this.incrementCurrencyFn = () => { - currency = currency.add(1); - return currency; - }; - - this.bondingCurveFn = ({ rate, count, total, overflow }) => { - if (count.eq(total)) return overflow; - if (rate.eq(this.constants.MaxPercent)) - return overflow.mul(count).div(total); - if (rate.eq(0)) - return overflow.mul(count).div(total).mul(count).div(total); - return overflow - .mul(count) - .div(total) - .mul( - rate.add(count.mul(this.constants.MaxPercent.sub(rate)).div(total)) - ) - .div(this.constants.MaxPercent); - }; - }); - - for (let i = 0; i < 8; i += 1) { - describe( - "Projects can be created, have their URIs changed, transfer/claim handles, and be attached to funding cycles", - run(workflows.projects) - ); - describe( - "Projects can have their handle's challenged, and claimed if not renewed in time", - run(workflows.challengeHandle) - ); - describe( - "Deployment of a project with funding cycles and mods included", - run(workflows.deploy) - ); - describe( - "Ticket holders can lock their tickets, which prevents them from being redeemed, unstaked, or transfered", - run(workflows.ticketLockingAndTransfers) - ); - describe("Redeem tickets for overflow", run(workflows.redeem)); - describe("Prints reserved tickets", run(workflows.printReservedTickets)); - describe( - "Projects can print premined tickets before a payment has been made to it", - run(workflows.printPreminedTickets) - ); - describe( - "Issues tickets and honors preference", - run(workflows.issueTickets) - ); - describe("Tap funds up to the configured target", run(workflows.tap)); - describe( - "A fee should be taken into governance's project when a project taps funds", - run(workflows.takeFee) - ); - describe("Reconfigures a project", run(workflows.reconfigure)); - describe( - "A funding cycle configuration can have a limit", - run(workflows.limit) - ); - describe( - "A funding cycle configuration can have a duration of 0", - run(workflows.zeroDuration) - ); - describe( - "A funding cycle configuration can be non recurring", - run(workflows.nonRecurring) - ); - describe( - "Ballot must be approved for reconfiguration to become active", - run(workflows.approvedBallot) - ); - describe( - "Reconfiguration that fails a ballot should be ignored", - run(workflows.failedBallot) - ); - describe( - "Reconfiguration proposed after a failed configuration should obide by the ballot duration", - run(workflows.iteratedFailedBallot) - ); - describe("Migrate from one Terminal to another", run(workflows.migrate)); - describe( - "Operators can be given permissions", - run(workflows.operatorPermissions) - ); - describe( - "Set and update payout mods, honoring locked status", - run(workflows.setPayoutMods) - ); - describe( - "Set and update ticket mods, honoring locked status", - run(workflows.setTicketMods) - ); - describe( - "A new governance can be appointed and accepted", - run(workflows.governance) - ); - describe( - "Governance can set a new fee for future configurations", - run(workflows.setFee) - ); - describe( - "Currencies rates are converted to/from correctly", - run(workflows.currencyConversion) - ); - describe( - "Transfer ownership over a project", - run(workflows.transferProjectOwnership) - ); - describe( - "Direct payment addresses can be deployed to add an fundable address to a project", - run(workflows.directPaymentAddresses) - ); - describe( - "A project can be created without a payment terminal, and can set one after", - run(workflows.setTerminal) - ); - describe( - "Proxy payment addresses can be deployed to add an fundable address to a project", - run(workflows.proxyPaymentAddresses) - ); - } -}; diff --git a/packages/hardhat/test/integration/workflows/approved_ballot.js b/packages/hardhat/test/integration/workflows/approved_ballot.js deleted file mode 100644 index 09b15b0eeb..0000000000 --- a/packages/hardhat/test/integration/workflows/approved_ballot.js +++ /dev/null @@ -1,693 +0,0 @@ -/** - A project can reconfigure its funding cycles subject to the approval of the ballot currently configured. - - If approved, a the reconfigured funding cycle will take affect after the current funding cycle expires. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - deployer, - constants, - contracts, - executeFn, - deployContractFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - getBalanceFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure with a ballot. - const owner = randomSignerFn(); - - // Use a ballot that has a fixed approval time one its duration passes. - const ballot = await deployContractFn("Active14DaysFundingCycleBallot"); - - // The duration of the funding cycle should be less than the ballot duration - const duration1 = randomBigNumberFn({ - min: BigNumber.from(1), - // The ballot duration is in seconds, but duration is in days. - // Take an arbitrary amount of seconds away from the end. - max: (await ballot.duration()).div(86400).sub(5) - }); - - // Make this zero to make test cases cleaner. - const cycleLimit1 = BigNumber.from(0); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - min: amountToTap.mul(3), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The target of the first funding cycle should be the same as the payment value. - const target1 = paymentValue; - - // make recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: deployer, - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot.address - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - payer, - paymentValue, - amountToTap - }; - } - }, - { - description: - "Make a payment to the project to lock in the current configuration", - fn: async ({ - contracts, - executeFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - timeMark, - local: { expectedProjectId, payer, paymentValue } - }) => { - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - return { originalTimeMark: timeMark }; - } - }, - { - description: "The funding cycle ballot state should be in standby", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 3 - }) - }, - { - description: "Reconfiguring should create a new funding cycle", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner, paymentValue } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - // The next funding cycle should be the second. - const expectedFundingCycleNumber2 = BigNumber.from(2); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target2 = randomBigNumberFn({ min: paymentValue.div(2) }); - - // Make the second currency the same as the first in order to fulfill a tap later. - const currency2 = BigNumber.from(currency); - - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - // Make this zero to make test cases cleaner. - const cycleLimit2 = BigNumber.from(0); - - // make recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId2, - expectedFundingCycleNumber2, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - }; - } - }, - { - description: "The funding cycle ballot state be active", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: "The queued funding cycle should have the reconfiguration", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - duration1, - ballot, - discountRate1, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - } - }) => { - // This is how many cycles can pass while the ballot is active and waiting for approval. - const cycleCountDuringBallot = (await ballot.duration()) - .div(86400) - .div(duration1); - - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInititalWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - let expectedPostBallotWeight = expectedInititalWeight; - for (let i = 0; i < cycleCountDuringBallot.add(1); i += 1) { - expectedPostBallotWeight = expectedPostBallotWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedPostBallotWeight, - ballot2, - // The start time should be two duration after the initial start. - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - BigNumber.from(0), - expectedPackedMetadata2 - ] - }); - - return { - reconfigurationTimeMark: timeMark, - cycleCountDuringBallot, - expectedPackedMetadata2, - expectedInititalWeight, - expectedPostBallotWeight, - expectedFee - }; - } - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - local: { expectedProjectId, amountToTap } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }) - }, - { - description: - "The current funding cycle should have the first configuration with some tapped", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - amountToTap, - ballot, - cycleLimit1, - duration1, - target1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - expectedFee, - expectedInititalWeight - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - originalTimeMark, - cycleLimit1, - expectedInititalWeight, - ballot.address, - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - amountToTap, - expectedPackedMetadata1 - ] - }); - return { expectedPackedMetadata1 }; - } - }, - { - description: "Fastforward to the end of the funding cycle", - fn: ({ fastforwardFn, local: { duration1 } }) => - fastforwardFn(duration1.mul(86400)) - }, - { - description: "The funding cycle ballot state should still be pending", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: - "The ballot should not yet be approved at the end of the funding cycle", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - constants, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber2, - originalTimeMark, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - expectedPackedMetadata1, - expectedFee, - expectedInititalWeight - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber2, - expectedFundingCycleId1, - originalTimeMark, - // The cycle limit should be one lower than the previous. - cycleLimit1.eq(0) ? BigNumber.from(0) : cycleLimit1.sub(1), - expectedInititalWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot.address, - // The start time should be one duration after the initial start. - originalTimeMark.add(duration1.mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: - "Fast forward to the cycle that starts soonest after the ballot has expired", - fn: ({ - fastforwardFn, - randomBigNumberFn, - BigNumber, - local: { duration1, cycleCountDuringBallot } - }) => - // Add random padding to comfortably fit the fast forward within the next cycle. - fastforwardFn( - duration1 - .mul(cycleCountDuringBallot) - .mul(86400) - .add( - randomBigNumberFn({ - min: BigNumber.from(3), - max: BigNumber.from(84397) - }) - ) - ) - }, - { - description: "The funding cycle ballot state should still be approved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 0 - }) - }, - { - description: "The current funding cycle should have the reconfiguration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - reconfigurationTimeMark, - duration1, - cycleCountDuringBallot, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - expectedPackedMetadata2, - expectedFee, - expectedPostBallotWeight - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - reconfigurationTimeMark, - cycleLimit2, - expectedPostBallotWeight, - ballot2, - // The start time should be two duration after the initial start. - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - BigNumber.from(0), - expectedPackedMetadata2 - ] - }) - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - local: { expectedProjectId, amountToTap, currency2 } - }) => { - const tapAmount2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: amountToTap - }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency2, 0] - }); - - return { tapAmount2 }; - } - }, - { - description: - "The current funding cycle should have the second tapped amount", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - reconfigurationTimeMark, - duration1, - cycleCountDuringBallot, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - expectedPackedMetadata2, - expectedFee, - expectedPostBallotWeight, - tapAmount2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - reconfigurationTimeMark, - cycleLimit2, - expectedPostBallotWeight, - ballot2, - // The start time should be two duration after the initial start. - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - tapAmount2, - expectedPackedMetadata2 - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/challenge_handle.js b/packages/hardhat/test/integration/workflows/challenge_handle.js deleted file mode 100644 index b0434f8e27..0000000000 --- a/packages/hardhat/test/integration/workflows/challenge_handle.js +++ /dev/null @@ -1,405 +0,0 @@ -/** - A project's handle can be challenged, after which a year must pass without it being renewed before it can be claimed. -*/ -module.exports = [ - { - description: "The challenge expiry for an unused handle should start at 0", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - incrementProjectIdFn, - randomBytesFn - }) => { - const expectedProjectId1 = incrementProjectIdFn(); - - // Make sure its unique by prepending the id. - const handle = randomBytesFn({ prepend: expectedProjectId1.toString() }); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: 0 - }); - - return { handle, expectedProjectId1 }; - } - }, - { - description: "Create a project", - fn: async ({ - deployer, - contracts, - executeFn, - randomStringFn, - randomSignerFn, - local: { handle } - }) => { - // The address that will own a project. - const owner = randomSignerFn(); - - await executeFn({ - caller: deployer, - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - handle, - randomStringFn(), - contracts.terminalV1.address - ] - }); - - return { owner, handle }; - } - }, - { - description: "Make sure the project's handle got saved", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId1], - expect: handle - }) - }, - { - description: "Make sure the project was saved to the handle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: expectedProjectId1 - }) - }, - { - description: "The challenge expiry should still be 0", - fn: async ({ contracts, checkFn, randomSignerFn, local: { handle } }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: 0 - }) - }, - { - description: "Challenge the handle", - fn: async ({ contracts, executeFn, randomSignerFn, local: { handle } }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeHandle", - args: [handle] - }) - }, - { - description: "Make sure the challenge expiry got set", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { handle } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: timeMark.add(31536000) - }); - - return { challengeTimeMark: timeMark }; - } - }, - { - description: "Create another project to claim the challenged handle onto", - fn: async ({ - deployer, - contracts, - executeFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - randomBytesFn - }) => { - // The address that will own the second project. - const claimer = randomSignerFn(); - - const expectedProjectId2 = incrementProjectIdFn(); - - // Make sure its unique by prepending the id. - const handle2 = randomBytesFn({ prepend: expectedProjectId2.toString() }); - - await executeFn({ - caller: deployer, - contract: contracts.projects, - fn: "create", - args: [ - claimer.address, - handle2, - randomStringFn(), - contracts.terminalV1.address - ] - }); - - return { claimer, handle2, expectedProjectId2 }; - } - }, - { - description: "Make sure the second project's handle got saved", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - local: { handle2, expectedProjectId2 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId2], - expect: handle2 - }) - }, - { - description: "Make sure the second project was saved to the handle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { handle2, expectedProjectId2 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle2], - expect: expectedProjectId2 - }) - }, - { - description: "Fastforward to within the challenge expiry", - fn: ({ fastforwardFn, BigNumber }) => - fastforwardFn(BigNumber.from(31535900)) - }, - { - description: "Claiming should still be unauthorized", - fn: ({ - contracts, - executeFn, - local: { handle, claimer, expectedProjectId2 } - }) => - executeFn({ - caller: claimer, - contract: contracts.projects, - fn: "claimHandle", - args: [handle, claimer.address, expectedProjectId2], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: "Fastforward to past the challenge expiry", - fn: ({ BigNumber, fastforwardFn, randomBigNumberFn }) => - fastforwardFn( - randomBigNumberFn({ - min: BigNumber.from(100), - max: BigNumber.from(9999) - }) - ) - }, - { - description: "Claim the handle", - fn: ({ - contracts, - executeFn, - local: { handle, claimer, expectedProjectId2 } - }) => - executeFn({ - caller: claimer, - contract: contracts.projects, - fn: "claimHandle", - args: [handle, claimer.address, expectedProjectId2] - }) - }, - { - description: "Make sure the second project's claimed handle got saved", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId2 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId2], - expect: handle - }) - }, - { - description: "Make sure the second project was saved to the claimed handle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId2 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: expectedProjectId2 - }) - }, - { - description: - "The first project should still have the handle, but not the resolver.", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId1], - expect: handle - }) - }, - { - description: "Make sure the challenge expiry got reset", - fn: ({ contracts, checkFn, randomSignerFn, local: { handle } }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: 0 - }) - }, - { - description: - "The original owner will try to claim the handle back, but it should be too soon", - fn: async ({ contracts, executeFn, randomSignerFn, local: { handle } }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeHandle", - args: [handle] - }) - }, - { - description: "Make sure the challenge expiry got set", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { handle } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: timeMark.add(31536000) - }); - - return { challengeTimeMark: timeMark }; - } - }, - { - description: "Fastforward to within the second challenge expiry", - fn: ({ fastforwardFn, BigNumber }) => - fastforwardFn(BigNumber.from(31535990)) - }, - { - description: - "The original owner will try to claim the handle back, but it should be too soon", - fn: ({ - contracts, - executeFn, - local: { handle, owner, expectedProjectId1 } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "claimHandle", - args: [handle, owner.address, expectedProjectId1], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: - "The claimer can renew the handle so that it cannot be claimed without being challenged again.", - fn: async ({ - contracts, - executeFn, - local: { expectedProjectId2, claimer } - }) => - executeFn({ - caller: claimer, - contract: contracts.projects, - fn: "renewHandle", - args: [expectedProjectId2] - }) - }, - { - description: "Make sure the challenge expiry got reset after the renewal", - fn: ({ contracts, checkFn, randomSignerFn, local: { handle } }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "challengeExpiryOf", - args: [handle], - expect: 0 - }) - }, - { - description: "Fastforward to past the challenge expiry prior to renewing", - fn: ({ BigNumber, fastforwardFn, randomBigNumberFn }) => - fastforwardFn( - randomBigNumberFn({ - min: BigNumber.from(10), - max: BigNumber.from(9999) - }) - ) - }, - { - description: - "Claiming should still be unauthorized because the handle has been renewed", - fn: ({ - contracts, - executeFn, - local: { handle, owner, expectedProjectId1 } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "claimHandle", - args: [handle, owner.address, expectedProjectId1], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/currency_conversion.js b/packages/hardhat/test/integration/workflows/currency_conversion.js deleted file mode 100644 index 4903fc1dae..0000000000 --- a/packages/hardhat/test/integration/workflows/currency_conversion.js +++ /dev/null @@ -1,357 +0,0 @@ -/** - Funding cycles can use currencies other than ETH that Governance has added price feeds for. - - Funds are always paid in ETH, but a funding cycle target can be denominated in another currencency. - This means that the the amount of ETH that a project can withdraw will change over time as the price - of ETH changes compared to their funding cycle's denominated currency. - - This test makes sure the conversion rates are honored. -*/ -module.exports = [ - { - description: "Add the price feed to the prices contract", - fn: async ({ - deployer, - contracts, - executeFn, - deployContractFn, - incrementCurrencyFn - }) => { - // An example price feed. - const priceFeed = await deployContractFn("ExampleETHUSDPriceFeed"); - const [, rate] = await priceFeed.latestRoundData(); - // The amount of decimals the price should be adjusted for. - const decimals = await priceFeed.decimals(); - - // The currency number that will store the price feed. Can't be 0, which is reserve for ETH, or any other currency already set. - const currency = incrementCurrencyFn(); - - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "addPriceFeed", - args: [contracts.prices.address, priceFeed.address, currency] - }); - return { priceFeed, decimals, rate, currency }; - } - }, - { - description: "Deploy first project", - fn: async ({ - constants, - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomBytesFn, - getBalanceFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - incrementFundingCycleIdFn, - local: { rate, decimals, currency } - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project with mods. - const owner = randomSignerFn(); - - // An account that will be used to make a payment. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValueInWei = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(2) - }); - // The target must be at most the payment value. - const targetDenominatedInWei = randomBigNumberFn({ - min: BigNumber.from(1), - max: paymentValueInWei - }); - - const targetDenominatedInCurrency = targetDenominatedInWei.mul( - rate.div(BigNumber.from(10).pow(decimals)) - ); - - // Set to zero to make the test cases cleaner. - const reservedRate = BigNumber.from(0); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: targetDenominatedInCurrency, - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ max: constants.MaxCycleLimit }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { - expectedProjectId, - owner, - payer, - paymentValueInWei, - reservedRate, - targetDenominatedInWei - }; - } - }, - { - description: - "Print premined tickets. The argument is denominated in `currency`", - fn: async ({ - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - local: { owner, rate, decimals, currency, expectedProjectId } - }) => { - // An account that will receive tickets for the premine. - const premineTicketBeneficiary = randomAddressFn(); - const premineValueInWei = randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }); - // Convert the premine value to the currency. - const premineValueInCurrency = premineValueInWei.mul( - rate.div(BigNumber.from(10).pow(decimals)) - ); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - premineValueInCurrency, - currency, - premineTicketBeneficiary, - randomStringFn(), - randomBoolFn() - ] - }); - return { premineTicketBeneficiary, premineValueInWei }; - } - }, - { - description: - "Check that the beneficiary of the premine got the correct amount of tickets", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { premineTicketBeneficiary, premineValueInWei, expectedProjectId } - }) => { - // The expected number of tickets to receive during the premine. - const expectedPremineTickets = premineValueInWei.mul( - constants.InitialWeightMultiplier - ); - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [premineTicketBeneficiary, expectedProjectId], - expect: expectedPremineTickets - }); - } - }, - { - description: "Make a payment to the project, denominated in `currency`", - fn: async ({ - contracts, - executeFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - local: { - payer, - paymentValueInWei, - expectedProjectId, - premineTicketBeneficiary - } - }) => { - // An account that will receive tickets for the payment. - // Exlcude the premine ticket beneficiary to make the test cases cleaner. - const paymentTicketBeneficiary = randomAddressFn({ - exclude: [premineTicketBeneficiary] - }); - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - paymentTicketBeneficiary, - randomStringFn(), - randomBoolFn() - ], - value: paymentValueInWei - }); - return { paymentTicketBeneficiary }; - } - }, - { - description: - "Check that the beneficiary of the payment got the correct amount of tickets", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - paymentValueInWei, - paymentTicketBeneficiary, - reservedRate, - expectedProjectId - } - }) => { - // The expected number of tickets to receive during the payment. - const expectedPaymentTickets = paymentValueInWei - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent) - .mul(constants.InitialWeightMultiplier); - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [paymentTicketBeneficiary, expectedProjectId], - expect: expectedPaymentTickets - }); - } - }, - { - description: "Check that the overflow amount is being converted correctly", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { paymentValueInWei, targetDenominatedInWei, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "currentOverflowOf", - args: [expectedProjectId], - expect: paymentValueInWei.sub(targetDenominatedInWei) - }) - }, - { - description: "Tap the full amount from the project", - fn: async ({ - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomSignerFn, - getBalanceFn, - local: { - targetDenominatedInWei, - rate, - decimals, - currency, - expectedProjectId, - owner - } - }) => { - // Tap a portion of the target. - const amountToTapInWei = targetDenominatedInWei.sub( - randomBigNumberFn({ - min: BigNumber.from(1), - max: targetDenominatedInWei - }) - ); - - // An amount up to the amount paid can be tapped. - const amountToTapInCurrency = amountToTapInWei.mul( - rate.div(BigNumber.from(10).pow(decimals)) - ); - - // Save the owner's balance before tapping. - const ownersInitialBalance = await getBalanceFn(owner.address); - - await executeFn({ - // Exclude the owner's address to not let gas mess up the balance calculation. - caller: randomSignerFn({ exclude: [owner.address] }), - contract: contracts.terminalV1, - fn: "tap", - args: [ - expectedProjectId, - amountToTapInCurrency, - currency, - amountToTapInWei - ] - }); - - return { amountToTapInWei, ownersInitialBalance }; - } - }, - { - description: "The tapped funds should be in the owners balance", - fn: async ({ - constants, - contracts, - verifyBalanceFn, - local: { owner, amountToTapInWei, ownersInitialBalance } - }) => { - // The amount tapped takes into account any fees paid. - const expectedTappedAmountInWei = amountToTapInWei - .mul(constants.MaxPercent) - .div((await contracts.terminalV1.fee()).add(constants.MaxPercent)); - await verifyBalanceFn({ - address: owner.address, - expect: ownersInitialBalance.add(expectedTappedAmountInWei) - }); - } - }, - { - description: - "Check that the overflow amount is still being converted correctly after tapping", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { paymentValueInWei, targetDenominatedInWei, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "currentOverflowOf", - args: [expectedProjectId], - expect: paymentValueInWei.sub(targetDenominatedInWei) - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/deploy.js b/packages/hardhat/test/integration/workflows/deploy.js deleted file mode 100644 index 8e54ac46b3..0000000000 --- a/packages/hardhat/test/integration/workflows/deploy.js +++ /dev/null @@ -1,241 +0,0 @@ -/** - Deploying a project through the TerminalV1 should create a project, configure a funding cycle, and set mods. - - These steps can all be taken seperately without calling `deploy`. -*/ -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - deployer, - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomStringFn, - randomAddressFn, - randomBytesFn, - incrementProjectIdFn, - incrementFundingCycleIdFn - }) => { - const expectedFundingCycleId = incrementFundingCycleIdFn(); - const expectedProjectId = incrementProjectIdFn(); - - const target = randomBigNumberFn(); - const handle = randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }); - const uri = randomStringFn(); - const currency = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - const cycleLimit = randomBigNumberFn({ - max: constants.MaxCycleLimit - }); - const discountRate = randomBigNumberFn({ - max: constants.MaxDiscountRate - }); - const ballot = constants.AddressZero; - - const reservedRate = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - - // These can be whatever. - const payoutMods = []; - const ticketMods = []; - - const contract = contracts.terminalV1; - const terminal = contract; - - await executeFn({ - caller: deployer, - contract, - fn: "deploy", - args: [ - randomAddressFn(), - handle, - uri, - { - target, - currency, - duration, - cycleLimit, - discountRate, - ballot - }, - { - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - }, - payoutMods, - ticketMods - ] - }); - return { - expectedFundingCycleId, - expectedProjectId, - handle, - uri, - target, - discountRate, - cycleLimit, - duration, - ballot, - currency, - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate, - terminal - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedFundingCycleId, - expectedProjectId, - target, - currency, - discountRate, - cycleLimit, - duration, - ballot, - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata = BigNumber.from(0); - expectedPackedMetadata = expectedPackedMetadata.add( - reconfigurationBondingCurveRate - ); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - expectedPackedMetadata = expectedPackedMetadata.add(bondingCurveRate); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - expectedPackedMetadata = expectedPackedMetadata.add(reservedRate); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedTapped = BigNumber.from(0); - - // It should be the project's first funding cycle. - const expectedFundingCycleNumber = BigNumber.from(1); - - // Expect the funding cycle to be based on the 0th funding cycle. - const expectedBasedOn = BigNumber.from(0); - - // Expect the funding cycle's weight to be the base weight. - const expectedWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId], - expect: [ - expectedFundingCycleId, - expectedProjectId, - expectedFundingCycleNumber, - expectedBasedOn, - timeMark, - cycleLimit, - expectedWeight, - ballot, - timeMark, - duration, - target, - currency, - expectedFee, - discountRate, - expectedTapped, - expectedPackedMetadata - ] - }); - } - }, - { - description: "Make sure the project's handle got saved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId], - expect: handle - }) - }, - { - description: "Make sure the project was saved to the handle", - fn: ({ - contracts, - randomSignerFn, - checkFn, - local: { handle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: expectedProjectId - }) - }, - { - description: "Make sure the project's uri got saved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { uri, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "uriOf", - args: [expectedProjectId], - expect: uri - }) - }, - { - description: - "Make sure the terminalV1 got set as the project's current terminal", - fn: ({ - randomSignerFn, - contracts, - checkFn, - local: { terminal, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: terminal.address - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/direct_payment_addresses.js b/packages/hardhat/test/integration/workflows/direct_payment_addresses.js deleted file mode 100644 index da13e6149a..0000000000 --- a/packages/hardhat/test/integration/workflows/direct_payment_addresses.js +++ /dev/null @@ -1,401 +0,0 @@ -/** - Projects can deploy addresses that will forward funds received to the project's funding cycle. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - const owner = randomSignerFn(); - - // Make the test case cleaner with a reserved rate of 0. - const reservedRate = BigNumber.from(0); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: randomBigNumberFn(), - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { owner, reservedRate, expectedProjectId }; - } - }, - { - description: - "Make sure the terminalV1 got set as the project's current terminal", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: contracts.terminalV1.address - }) - }, - { - description: "Deploy a direct payment address", - fn: ({ - executeFn, - deployer, - contracts, - randomStringFn, - local: { expectedProjectId } - }) => - executeFn({ - caller: deployer, - contract: contracts.terminalDirectory, - fn: "deployAddress", - args: [expectedProjectId, randomStringFn()] - }) - }, - { - description: "Make a payment to the address", - fn: async ({ - contracts, - randomBigNumberFn, - BigNumber, - getBalanceFn, - randomSignerFn, - local: { expectedProjectId } - }) => { - const [address] = await contracts.terminalDirectory.addressesOf( - expectedProjectId - ); - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Three payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await payer.sendTransaction({ - to: address, - value: paymentValue - }); - - return { payer, paymentValue }; - } - }, - { - description: "There should now be a balance in the terminal", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { paymentValue, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [expectedProjectId], - expect: paymentValue - }) - }, - { - description: "The payer should have gotten tickets", - fn: async ({ - randomSignerFn, - constants, - contracts, - checkFn, - local: { payer, paymentValue, reservedRate, expectedProjectId } - }) => { - const expectedTicketAmount = paymentValue - .mul(constants.InitialWeightMultiplier) - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [payer.address, expectedProjectId], - expect: expectedTicketAmount - }); - return { expectedTicketAmount }; - } - }, - { - description: "Set a beneficiary address and staked ticket preference", - fn: async ({ - contracts, - executeFn, - randomBoolFn, - randomAddressFn, - local: { payer } - }) => { - // The beneficiary to give tickets to. - // Exclude the payers address to make the test cases cleaner. - const payerTicketBeneficiary = randomAddressFn({ - exclude: [payer.address] - }); - // The unstaked preference to set. - const preferUnstakedTickets = randomBoolFn(); - await executeFn({ - caller: payer, - contract: contracts.terminalDirectory, - fn: "setPayerPreferences", - args: [payerTicketBeneficiary, preferUnstakedTickets] - }); - return { payerTicketBeneficiary, preferUnstakedTickets }; - } - }, - { - description: "Issue tickets", - fn: ({ - contracts, - executeFn, - randomStringFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedProjectId, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: "Deploy another direct payment address", - fn: ({ - deployer, - contracts, - executeFn, - randomStringFn, - local: { expectedProjectId } - }) => - executeFn({ - caller: deployer, - contract: contracts.terminalDirectory, - fn: "deployAddress", - args: [expectedProjectId, randomStringFn()] - }) - }, - { - description: "Make another payment to the address", - fn: async ({ - contracts, - local: { payer, paymentValue, expectedProjectId } - }) => { - const [, secondAddress] = await contracts.terminalDirectory.addressesOf( - expectedProjectId - ); - await payer.sendTransaction({ - to: secondAddress, - value: paymentValue - }); - } - }, - { - description: - "There should now be a double the payment value balance in the terminal", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { paymentValue, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [expectedProjectId], - expect: paymentValue.mul(2) - }) - }, - { - description: "The beneficiary should have gotten tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { payerTicketBeneficiary, expectedTicketAmount, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [payerTicketBeneficiary, expectedProjectId], - expect: expectedTicketAmount - }) - }, - { - description: - "If there was a preference for unstaked tickets, the tickets should be unstaked", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - payerTicketBeneficiary, - expectedTicketAmount, - preferUnstakedTickets, - expectedProjectId - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [payerTicketBeneficiary, expectedProjectId], - expect: preferUnstakedTickets ? 0 : expectedTicketAmount - }) - }, - { - description: "Allow a migration to the new terminal", - fn: async ({ deployer, contracts, executeFn, deployContractFn }) => { - // The terminalV1 that will be migrated to. - const secondTerminalV1 = await deployContractFn("TerminalV1", [ - contracts.projects.address, - contracts.fundingCycles.address, - contracts.ticketBooth.address, - contracts.operatorStore.address, - contracts.modStore.address, - contracts.prices.address, - contracts.terminalDirectory.address, - contracts.governance.address - ]); - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "allowMigration", - args: [contracts.terminalV1.address, secondTerminalV1.address] - }); - return { secondTerminalV1 }; - } - }, - { - description: "Migrate to the new terminal", - fn: ({ - contracts, - executeFn, - local: { owner, expectedProjectId, secondTerminalV1 } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, secondTerminalV1.address] - }) - }, - { - description: - "Make another payment to the address. It should now have been routed to the new terminal", - fn: async ({ - contracts, - local: { payer, paymentValue, expectedProjectId } - }) => { - const [address] = await contracts.terminalDirectory.addressesOf( - expectedProjectId - ); - await payer.sendTransaction({ - to: address, - value: paymentValue - }); - } - }, - { - description: - "There should now be triple the payment value balance in the new terminal", - fn: ({ - checkFn, - randomSignerFn, - local: { paymentValue, expectedProjectId, secondTerminalV1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: secondTerminalV1, - fn: "balanceOf", - args: [expectedProjectId], - expect: paymentValue.mul(3) - }) - }, - { - description: "The beneficiary should have gotten tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { payerTicketBeneficiary, expectedTicketAmount, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [payerTicketBeneficiary, expectedProjectId], - expect: expectedTicketAmount.mul(2) - }) - }, - { - description: "Set a beneficiary address back to the paying address", - fn: ({ contracts, executeFn, randomBoolFn, local: { payer } }) => - executeFn({ - caller: payer, - contract: contracts.terminalDirectory, - fn: "setPayerPreferences", - args: [payer.address, randomBoolFn()] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/failed_ballot.js b/packages/hardhat/test/integration/workflows/failed_ballot.js deleted file mode 100644 index e0d831a0a8..0000000000 --- a/packages/hardhat/test/integration/workflows/failed_ballot.js +++ /dev/null @@ -1,756 +0,0 @@ -/** - This test is the same as the `approveBallot` test, but instead of a ballot that auto succeeds after its duration, - the initial configuration of this test uses a ballot that auto fails after its duration. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - deployer, - constants, - contracts, - executeFn, - deployContractFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - getBalanceFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure with a ballot. - const owner = randomSignerFn(); - - // Use a ballot that fails exactly halfway through its duration. - const ballot = await deployContractFn("ExampleFailingFundingCycleBallot"); - - // The duration of the funding cycle should be less than the ballot duration - const duration1 = randomBigNumberFn({ - // Fails after half. - min: (await ballot.duration()).div(86400).div(2), - // The ballot duration is in seconds, but duration is in days. - max: (await ballot.duration()).div(86400).sub(1) - }); - - // Make this zero to make test cases cleaner. - const cycleLimit1 = BigNumber.from(0); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - min: amountToTap.mul(3), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The target of the first funding cycle should be the same as the payment value. - const target1 = paymentValue; - - // make recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: deployer, - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot.address - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - payer, - paymentValue, - amountToTap - }; - } - }, - { - description: - "Make a payment to the project to lock in the current configuration", - fn: async ({ - contracts, - executeFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - timeMark, - local: { expectedProjectId, payer, paymentValue } - }) => { - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - return { originalTimeMark: timeMark }; - } - }, - { - description: "The funding cycle ballot state should be in standby", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 3 - }) - }, - { - description: "Reconfiguring should create a new funding cycle", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - // The next funding cycle should be the second. - const expectedFundingCycleNumber2 = BigNumber.from(2); - - const target2 = randomBigNumberFn(); - - const currency2 = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - // Make this zero to make test cases cleaner. - const cycleLimit2 = BigNumber.from(0); - - // make recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId2, - expectedFundingCycleNumber2, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - }; - } - }, - { - description: "The funding cycle ballot state should be active", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: "The queued funding cycle should have the reconfiguration", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - duration1, - ballot, - discountRate1, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - } - }) => { - // This is how many cycles can pass while the ballot is active and waiting for approval. - const cycleCountDuringBallot = (await ballot.duration()) - .div(86400) - .div(duration1); - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInititalWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - let expectedPostBallotWeight = expectedInititalWeight; - for (let i = 0; i < cycleCountDuringBallot.add(1); i += 1) { - expectedPostBallotWeight = expectedPostBallotWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedPostBallotWeight, - ballot2, - // The start time should be two duration after the initial start. - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - BigNumber.from(0), - expectedPackedMetadata2 - ] - }); - - return { - reconfigurationTimeMark: timeMark, - cycleCountDuringBallot, - expectedPackedMetadata2, - expectedInititalWeight, - expectedPostBallotWeight, - expectedFee - }; - } - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - local: { expectedProjectId, amountToTap } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }) - }, - { - description: - "The current funding cycle should have the first configuration with some tapped", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - amountToTap, - ballot, - cycleLimit1, - duration1, - target1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - expectedFee, - expectedInititalWeight - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - originalTimeMark, - cycleLimit1, - expectedInititalWeight, - ballot.address, - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - amountToTap, - expectedPackedMetadata1 - ] - }); - return { expectedPackedMetadata1 }; - } - }, - { - description: "The funding cycle ballot state should still be active", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: "Fastforward to the end of the funding cycle", - fn: ({ fastforwardFn, local: { duration1 } }) => - fastforwardFn(duration1.mul(86400)) - }, - { - description: "The funding cycle ballot state should be failed", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 2 - }) - }, - { - description: - "The current funding cycle should have a new funding cycle of the first configuration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - constants, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber2, - originalTimeMark, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - expectedPackedMetadata1, - expectedFee, - expectedInititalWeight - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber2, - expectedFundingCycleId1, - originalTimeMark, - // The cycle limit should be one lower than the previous. - cycleLimit1.eq(0) ? BigNumber.from(0) : cycleLimit1.sub(1), - expectedInititalWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot.address, - // The start time should be one duration after the initial start. - originalTimeMark.add(duration1.mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: "Fast forward to the end of ballot duration.", - fn: async ({ - fastforwardFn, - randomBigNumberFn, - BigNumber, - local: { cycleCountDuringBallot, duration1 } - }) => - // Add random padding to comfortably fit the fast forward within the next cycle. - fastforwardFn( - duration1 - .mul(cycleCountDuringBallot) - .mul(86400) - .add( - randomBigNumberFn({ - min: BigNumber.from(3), - max: BigNumber.from(84397) - }) - ) - ) - }, - { - description: "The funding cycle ballot state should still be failed", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 2 - }) - }, - { - description: - "The current funding cycle should not have the reconfiguration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - cycleCountDuringBallot, - originalTimeMark, - duration1, - cycleLimit1, - ballot, - target1, - discountRate1, - expectedPackedMetadata1, - expectedPostBallotWeight, - expectedFee - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit1.eq(0) || cycleCountDuringBallot.add(1).gt(cycleLimit1) - ? BigNumber.from(0) - : cycleLimit1.sub(cycleCountDuringBallot.add(1)), - expectedPostBallotWeight, - ballot.address, - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: "The queued funding cycle should not have the reconfiguration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - constants, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - cycleCountDuringBallot, - originalTimeMark, - duration1, - cycleLimit1, - ballot, - target1, - discountRate1, - expectedPackedMetadata1, - expectedPostBallotWeight, - expectedFee - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(2), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit1, - expectedPostBallotWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot.address, - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(2)) - ), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, amountToTap } - }) => { - // Tapping should create a new funding cycle. - const expectedFundingCycleId3 = incrementFundingCycleIdFn(); - - // Leave some left for tapping another amount later. - const tapAmount2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: amountToTap - }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, tapAmount2, currency, 0] - }); - - return { expectedFundingCycleId3, tapAmount2 }; - } - }, - { - description: "The current funding cycle should have the tapped amount", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId3, - expectedFundingCycleNumber1, - cycleCountDuringBallot, - originalTimeMark, - duration1, - cycleLimit1, - ballot, - target1, - discountRate1, - expectedPackedMetadata1, - expectedPostBallotWeight, - expectedFee, - tapAmount2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId3, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit1.eq(0) || cycleCountDuringBallot.add(1).gt(cycleLimit1) - ? BigNumber.from(0) - : cycleLimit1.sub(cycleCountDuringBallot.add(1)), - expectedPostBallotWeight, - ballot.address, - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - tapAmount2, - expectedPackedMetadata1 - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/governance.js b/packages/hardhat/test/integration/workflows/governance.js deleted file mode 100644 index 8db1769636..0000000000 --- a/packages/hardhat/test/integration/workflows/governance.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - The governance of the TerminalV1 can transfer its power to a new address. - To do so, the governance must appoint a new address, and that address must accept the appointment. -*/ -module.exports = [ - { - description: "The initial governance can set a new fee", - fn: ({ executeFn, deployer, contracts, randomBigNumberFn, constants }) => - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "setFee", - args: [ - contracts.terminalV1.address, - randomBigNumberFn({ max: constants.MaxPercent }) - ] - }) - }, - { - description: "Appoint a new governance", - fn: async ({ executeFn, deployer, contracts, randomSignerFn }) => { - // Appoint a governance with a different address. - const firstAppointedGovernance = randomSignerFn(); - - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "appointGovernance", - args: [contracts.terminalV1.address, firstAppointedGovernance.address] - }); - return { firstAppointedGovernance }; - } - }, - { - description: "The appointed governance shouldn't yet be able to set a fee", - fn: ({ - executeFn, - contracts, - randomBigNumberFn, - constants, - local: { firstAppointedGovernance } - }) => - executeFn({ - caller: firstAppointedGovernance, - contract: contracts.terminalV1, - fn: "setFee", - args: [randomBigNumberFn({ max: constants.MaxPercent })], - revert: "TerminalV1: UNAUTHORIZED" - }) - }, - { - description: "The current governance should still be able to set a fee", - fn: ({ executeFn, deployer, contracts, randomBigNumberFn, constants }) => - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "setFee", - args: [ - contracts.terminalV1.address, - randomBigNumberFn({ max: constants.MaxPercent }) - ] - }) - }, - { - description: "Appoint a different governance", - fn: async ({ executeFn, deployer, contracts, randomSignerFn }) => { - // Appoint another governance with yet another address. - const secondAppointedGovernance = randomSignerFn(); - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "appointGovernance", - args: [contracts.terminalV1.address, secondAppointedGovernance.address] - }); - return { secondAppointedGovernance }; - } - }, - { - description: - "If they're different, the first appointed governance should no longer be able to accept", - fn: ({ - executeFn, - contracts, - local: { firstAppointedGovernance, secondAppointedGovernance } - }) => - executeFn({ - caller: firstAppointedGovernance, - contract: contracts.terminalV1, - fn: "acceptGovernance", - args: [], - revert: - firstAppointedGovernance.address !== - secondAppointedGovernance.address && - "TerminalV1::acceptGovernance: UNAUTHORIZED" - }) - }, - { - description: "Accept a new governance", - fn: ({ executeFn, contracts, local: { secondAppointedGovernance } }) => - executeFn({ - caller: secondAppointedGovernance, - contract: contracts.terminalV1, - fn: "acceptGovernance", - args: [] - }) - }, - { - description: "The old governance should no longer be able to set a fee", - fn: ({ - executeFn, - deployer, - contracts, - randomBigNumberFn, - constants, - local: { secondAppointedGovernance } - }) => - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "setFee", - args: [ - contracts.terminalV1.address, - randomBigNumberFn({ max: constants.MaxPercent }) - ], - revert: - contracts.governance.address !== secondAppointedGovernance.address && - "TerminalV1: UNAUTHORIZED" - }) - }, - { - description: "The new governance should be able to set a fee", - fn: ({ - executeFn, - randomBigNumberFn, - constants, - contracts, - local: { secondAppointedGovernance } - }) => - executeFn({ - caller: secondAppointedGovernance, - contract: contracts.terminalV1, - fn: "setFee", - args: [randomBigNumberFn({ max: constants.MaxPercent })] - }) - }, - { - description: - "New governance should be able to appoint the old governance back", - fn: ({ executeFn, contracts, local: { secondAppointedGovernance } }) => - executeFn({ - caller: secondAppointedGovernance, - contract: contracts.terminalV1, - fn: "appointGovernance", - args: [contracts.governance.address] - }) - }, - { - description: "Set the old governance back", - fn: ({ executeFn, contracts, deployer }) => { - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "acceptGovernance", - args: [contracts.terminalV1.address] - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/index.js b/packages/hardhat/test/integration/workflows/index.js deleted file mode 100644 index 05e35aceb3..0000000000 --- a/packages/hardhat/test/integration/workflows/index.js +++ /dev/null @@ -1,61 +0,0 @@ -const deploy = require("./deploy"); -const migrate = require("./migrate"); -const payoutToPayoutMods = require("./tap"); -const setPayoutMods = require("./set_payout_mods"); -const setTicketMods = require("./set_ticket_mods"); -const tap = require("./tap"); -const redeem = require("./redeem"); -const printReservedTickets = require("./print_reserved_tickets"); -const issueTickets = require("./issue_tickets"); -const reconfigure = require("./reconfigure"); -const approvedBallot = require("./approved_ballot"); -const failedBallot = require("./failed_ballot"); -const iteratedFailedBallot = require("./iterated_failed_ballot"); -const governance = require("./governance"); -const setFee = require("./set_fee"); -const printPreminedTickets = require("./print_premined_tickets"); -const projects = require("./projects"); -const currencyConversion = require("./currency_conversion"); -const transferProjectOwnership = require("./transfer_project_ownership"); -const directPaymentAddresses = require("./direct_payment_addresses"); -const operatorPermissions = require("./operator_permissions"); -const ticketLockingAndTransfers = require("./ticket_locking_and transfers"); -const setTerminal = require("./set_terminal"); -const limit = require("./limit"); -const zeroDuration = require("./zero_duration"); -const nonRecurring = require("./non_recurring"); -const challengeHandle = require("./challenge_handle"); -const takeFee = require("./take_fee"); -const proxyPaymentAddresses = require("./proxy_payment_addresses"); - -module.exports = { - deploy, - projects, - migrate, - payoutToPayoutMods, - setPayoutMods, - setTicketMods, - tap, - redeem, - printReservedTickets, - issueTickets, - reconfigure, - approvedBallot, - failedBallot, - iteratedFailedBallot, - governance, - setFee, - printPreminedTickets, - currencyConversion, - transferProjectOwnership, - directPaymentAddresses, - operatorPermissions, - ticketLockingAndTransfers, - setTerminal, - limit, - zeroDuration, - nonRecurring, - challengeHandle, - takeFee, - proxyPaymentAddresses, -}; diff --git a/packages/hardhat/test/integration/workflows/issue_tickets.js b/packages/hardhat/test/integration/workflows/issue_tickets.js deleted file mode 100644 index 0f9ca2eb74..0000000000 --- a/packages/hardhat/test/integration/workflows/issue_tickets.js +++ /dev/null @@ -1,607 +0,0 @@ -/** - Projects can issue ERC-20 tickets that can be unstaked from the Juicebox contracts - and used throughout Web3. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project for the owner", - fn: async ({ - executeFn, - randomBigNumberFn, - randomSignerFn, - randomStringFn, - BigNumber, - getBalanceFn, - randomBytesFn, - incrementProjectIdFn, - incrementFundingCycleIdFn, - constants, - contracts - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project that will migrate. - const owner = randomSignerFn(); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Two payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily find a number less than a third so that all payments can be made successfully. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The project's funding cycle target will at most be a fourth of the payment value. Leaving plenty of overflow. - const target = randomBigNumberFn({ - max: paymentValue1.add(paymentValue2).div(4) - }); - - // Set a random percentage of tickets to reserve for the project owner. - const reservedRate = randomBigNumberFn({ max: constants.MaxPercent }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target, - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { - expectedProjectId, - owner, - payer, - paymentValue1, - paymentValue2, - reservedRate - }; - } - }, - { - description: "The owner should not have issued tickets initially", - fn: ({ - checkFn, - randomSignerFn, - contracts, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "ticketsOf", - args: [expectedProjectId], - expect: constants.AddressZero - }) - }, - { - description: - "Make a payment to the project without first issueing tickets should print staked tickets", - fn: async ({ - randomSignerFn, - executeFn, - contracts, - randomStringFn, - randomBoolFn, - local: { expectedProjectId, payer, paymentValue1 } - }) => { - // An account that will be distributed tickets in the first payment. - const ticketBeneficiary = randomSignerFn(); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }); - - return { ticketBeneficiary }; - } - }, - { - description: "The ticket beneficiary should have tickets", - fn: async ({ - checkFn, - constants, - randomSignerFn, - contracts, - local: { - paymentValue1, - reservedRate, - ticketBeneficiary, - expectedProjectId - } - }) => { - // The amount of tickets that will be expected to be staked after the first payment. - const expectedStakedBalance = paymentValue1 - .mul(constants.InitialWeightMultiplier) - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }); - - return { expectedStakedBalance }; - } - }, - { - description: "The ticket beneficiary's tickets should all be staked", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { ticketBeneficiary, expectedProjectId, expectedStakedBalance } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "Issue tickets", - fn: ({ - executeFn, - contracts, - randomStringFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedProjectId, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: - "Make another payment to the project now that tickets have been issued. Prefer unstaked tickets from the payment.", - fn: ({ - executeFn, - contracts, - randomStringFn, - local: { payer, expectedProjectId, ticketBeneficiary, paymentValue2 } - }) => - executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary.address, - randomStringFn(), - true // prefer unstaked - ], - value: paymentValue2 - }) - }, - { - description: - "The ticket beneficiary should have both unstaked and staked tickets", - fn: async ({ - randomSignerFn, - checkFn, - constants, - contracts, - local: { - paymentValue1, - paymentValue2, - reservedRate, - expectedProjectId, - ticketBeneficiary - } - }) => { - // Total amount of tickets that will be expected to be both staked and unstaked after the second payment. - const expectedTotalTicketBalance = paymentValue1 - .add(paymentValue2) - .mul(constants.InitialWeightMultiplier) - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedTotalTicketBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }); - - return { expectedTotalTicketBalance }; - } - }, - { - description: - "The ticket beneficiary's tickets staked tickets should still be staked", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { ticketBeneficiary, expectedProjectId, expectedStakedBalance } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "Redeem some of the staked tickets", - fn: async ({ - randomBigNumberFn, - executeFn, - BigNumber, - contracts, - randomAddressFn, - local: { expectedStakedBalance, ticketBeneficiary, expectedProjectId } - }) => { - // Get a subset of the staked tickets. - const redeemedPortionOfStakedBalance = expectedStakedBalance.eq(0) - ? BigNumber.from(0) - : expectedStakedBalance.sub( - randomBigNumberFn({ - min: BigNumber.from(1), - max: expectedStakedBalance.sub(1) - }) - ); - - // Find how much the subset is redeemable for. - const claimableAmount = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary.address, - expectedProjectId, - redeemedPortionOfStakedBalance - ); - - const expectNoOp = - redeemedPortionOfStakedBalance.eq(0) || claimableAmount.eq(0); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - redeemedPortionOfStakedBalance, - claimableAmount, - randomAddressFn(), - false // prefer staked - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - return { - redeemedPortionOfStakedBalance: expectNoOp - ? BigNumber.from(0) - : redeemedPortionOfStakedBalance - }; - } - }, - { - description: "The staked balance should have the redeemed portion removed", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { - ticketBeneficiary, - expectedProjectId, - expectedStakedBalance, - redeemedPortionOfStakedBalance - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance.sub(redeemedPortionOfStakedBalance), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "The total balance should have the redeemed portion removed", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { - redeemedPortionOfStakedBalance, - ticketBeneficiary, - expectedProjectId, - expectedTotalTicketBalance - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedTotalTicketBalance.sub(redeemedPortionOfStakedBalance), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "Redeem some of the unstaked tickets", - fn: async ({ - executeFn, - randomBigNumberFn, - BigNumber, - contracts, - randomAddressFn, - local: { - expectedTotalTicketBalance, - expectedStakedBalance, - ticketBeneficiary, - expectedProjectId - } - }) => { - const expectedUnstakedBalance = expectedTotalTicketBalance.sub( - expectedStakedBalance - ); - const redeemedPortionOfUnstakedBalance = expectedUnstakedBalance.eq(0) - ? BigNumber.from(0) - : expectedUnstakedBalance.sub( - randomBigNumberFn({ - min: BigNumber.from(1), - max: expectedUnstakedBalance.sub(1) - }) - ); - - // Find how much the subset is redeemable for. - const claimableAmount = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary.address, - expectedProjectId, - redeemedPortionOfUnstakedBalance - ); - - const expectNoOp = - redeemedPortionOfUnstakedBalance.eq(0) || claimableAmount.eq(0); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - redeemedPortionOfUnstakedBalance, - 0, - randomAddressFn(), - true // prefer unstaked - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - return { - redeemedPortionOfUnstakedBalance: expectNoOp - ? BigNumber.from(0) - : redeemedPortionOfUnstakedBalance - }; - } - }, - { - description: "The staked balance should be the same as it was", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { - redeemedPortionOfStakedBalance, - ticketBeneficiary, - expectedProjectId, - expectedStakedBalance - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance.sub(redeemedPortionOfStakedBalance), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "The total balance should have both redeemed portions removed", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { - redeemedPortionOfStakedBalance, - redeemedPortionOfUnstakedBalance, - expectedProjectId, - ticketBeneficiary, - expectedTotalTicketBalance - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedTotalTicketBalance - .sub(redeemedPortionOfStakedBalance) - .sub(redeemedPortionOfUnstakedBalance), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10 - } - }) - }, - { - description: "Redeem the rest of the tickets", - fn: async ({ - executeFn, - randomAddressFn, - randomBoolFn, - contracts, - BigNumber, - local: { ticketBeneficiary, expectedProjectId } - }) => { - const balance = await contracts.ticketBooth.balanceOf( - ticketBeneficiary.address, - expectedProjectId - ); - - const stakedBalance = await contracts.ticketBooth.stakedBalanceOf( - ticketBeneficiary.address, - expectedProjectId - ); - - // Find how much the balance is redeemable for. - const claimableAmount = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary.address, - expectedProjectId, - balance - ); - - const expectNoOp = balance.eq(0) || claimableAmount.eq(0); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - balance, - claimableAmount, - randomAddressFn(), - randomBoolFn() - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - return { - leftoverTickets: expectNoOp ? balance : BigNumber.from(0), - stakedBalance - }; - } - }, - { - description: "The ticket balance of the project should now be zero", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { ticketBeneficiary, expectedProjectId, leftoverTickets } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: leftoverTickets - }) - }, - { - description: "The staked ticket balance of the project should now be zero", - fn: async ({ - checkFn, - randomSignerFn, - contracts, - local: { - ticketBeneficiary, - expectedProjectId, - leftoverTickets, - stakedBalance - } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - // eslint-disable-next-line - expect: leftoverTickets.eq(0) ? 0 : stakedBalance - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/iterated_failed_ballot.js b/packages/hardhat/test/integration/workflows/iterated_failed_ballot.js deleted file mode 100644 index 1f754f526d..0000000000 --- a/packages/hardhat/test/integration/workflows/iterated_failed_ballot.js +++ /dev/null @@ -1,761 +0,0 @@ -/** - If a funding cycle ballot fails, any subsequent reconfigurations should be based on the last approved cycle. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - deployer, - constants, - contracts, - executeFn, - deployContractFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - getBalanceFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure with a ballot. - const owner = randomSignerFn(); - - // Use a ballot that fails exactly halfway through its duration. - const ballot = await deployContractFn("ExampleFailingFundingCycleBallot"); - - // The duration of the funding cycle should be less than the ballot duration - const duration1 = randomBigNumberFn({ - // Fails after half. - min: (await ballot.duration()).div(86400).div(2), - // The ballot duration is in seconds, but duration is in days. - max: (await ballot.duration()).div(86400).sub(1) - }); - - // Make this zero to make test cases cleaner. - const cycleLimit1 = BigNumber.from(0); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - min: amountToTap.mul(3), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The target of the first funding cycle should be the same as the payment value. - const target1 = paymentValue; - - // make recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: deployer, - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot.address - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - payer, - paymentValue, - amountToTap - }; - } - }, - { - description: - "Make a payment to the project to lock in the current configuration", - fn: async ({ - contracts, - executeFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - timeMark, - local: { expectedProjectId, payer, paymentValue } - }) => { - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - return { originalTimeMark: timeMark }; - } - }, - { - description: "The funding cycle ballot state should be in standby", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 3 - }) - }, - { - description: "Reconfiguring should create a new funding cycle", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - // The next funding cycle should be the second. - const expectedFundingCycleNumber2 = BigNumber.from(2); - - const target2 = randomBigNumberFn(); - - const currency2 = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - // Make this zero to make test cases cleaner. - const cycleLimit2 = BigNumber.from(0); - - // make recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId2, - expectedFundingCycleNumber2, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - }; - } - }, - { - description: "The funding cycle ballot state should be active", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: "The queued funding cycle should have the reconfiguration", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - duration1, - ballot, - discountRate1, - cycleLimit2, - target2, - ballot2, - duration2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - } - }) => { - // This is how many cycles can pass while the ballot is active and waiting for approval. - const cycleCountDuringBallot = (await ballot.duration()) - .div(86400) - .div(duration1); - - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInititalWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - let expectedPostBallotWeight = expectedInititalWeight; - for (let i = 0; i < cycleCountDuringBallot.add(1); i += 1) { - expectedPostBallotWeight = expectedPostBallotWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedPostBallotWeight, - ballot2, - // The start time should be two duration after the initial start. - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - BigNumber.from(0), - expectedPackedMetadata2 - ] - }); - - return { - reconfigurationTimeMark: timeMark, - cycleCountDuringBallot, - expectedPackedMetadata2, - expectedInititalWeight, - expectedPostBallotWeight, - expectedFee - }; - } - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - local: { expectedProjectId, amountToTap } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }) - }, - { - description: - "The current funding cycle should have the first configuration with some tapped", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - amountToTap, - ballot, - cycleLimit1, - duration1, - target1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - expectedFee, - expectedInititalWeight - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - originalTimeMark, - cycleLimit1, - expectedInititalWeight, - ballot.address, - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - amountToTap, - expectedPackedMetadata1 - ] - }); - return { expectedPackedMetadata1 }; - } - }, - { - description: "The funding cycle ballot state should still be active", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }) - }, - { - description: "Fastforward to the end of the funding cycle", - fn: ({ fastforwardFn, local: { duration1 } }) => - fastforwardFn(duration1.mul(86400)) - }, - { - description: "The funding cycle ballot state should be failed", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 2 - }) - }, - { - description: - "The current funding cycle should have a new funding cycle of the first configuration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - constants, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber2, - originalTimeMark, - ballot, - cycleLimit1, - duration1, - discountRate1, - target1, - expectedPackedMetadata1, - expectedFee, - expectedInititalWeight - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber2, - expectedFundingCycleId1, - originalTimeMark, - // The cycle limit should be one lower than the previous. - cycleLimit1.eq(0) ? BigNumber.from(0) : cycleLimit1.sub(1), - expectedInititalWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot.address, - // The start time should be one duration after the initial start. - originalTimeMark.add(duration1.mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: "Fast forward to the end of ballot duration.", - fn: async ({ - fastforwardFn, - randomBigNumberFn, - BigNumber, - local: { cycleCountDuringBallot, duration1 } - }) => - // Add random padding to comfortably fit the fast forward within the next cycle. - fastforwardFn( - duration1 - .mul(cycleCountDuringBallot) - .mul(86400) - .add( - randomBigNumberFn({ - min: BigNumber.from(3), - max: BigNumber.from(84397) - }) - ) - ) - }, - { - description: "The funding cycle ballot state should still be failed", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 2 - }) - }, - { - description: - "Reconfiguring should create a new funding cycle that should obide by the ballot", - fn: async ({ - contracts, - executeFn, - incrementFundingCycleIdFn, - local: { - expectedProjectId, - owner, - target2, - currency2, - duration2, - cycleLimit2, - discountRate2, - ballot2, - reservedRate2, - bondingCurveRate2, - reconfigurationBondingCurveRate2 - } - }) => { - const expectedFundingCycleId3 = incrementFundingCycleIdFn(); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId3 - }; - } - }, - { - description: "The funding cycle ballot state should be active", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { expectedProjectId } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentBallotStateOf", - args: [expectedProjectId], - expect: 1 - }); - return { secondReconfigurationTimeMark: timeMark }; - } - }, - { - description: - "The current funding cycle should not have the reconfiguration", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - cycleCountDuringBallot, - originalTimeMark, - duration1, - cycleLimit1, - ballot, - target1, - discountRate1, - expectedPackedMetadata1, - expectedPostBallotWeight, - expectedFee - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleCountDuringBallot).add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit1.eq(0) || cycleCountDuringBallot.add(1).gt(cycleLimit1) - ? BigNumber.from(0) - : cycleLimit1.sub(cycleCountDuringBallot.add(1)), - expectedPostBallotWeight, - ballot.address, - originalTimeMark.add( - duration1.mul(86400).mul(cycleCountDuringBallot.add(1)) - ), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - BigNumber.from(0), - expectedPackedMetadata1 - ] - }) - }, - { - description: "The queued funding cycle should have the reconfiguration", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - constants, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - cycleCountDuringBallot, - originalTimeMark, - duration2, - duration1, - cycleLimit2, - ballot2, - target2, - discountRate1, - discountRate2, - currency2, - expectedPackedMetadata2, - secondReconfigurationTimeMark, - expectedPostBallotWeight, - expectedFee, - expectedFundingCycleId3 - } - }) => { - let expectedPostDoubleBallotWeight = expectedPostBallotWeight; - for (let i = 0; i < cycleCountDuringBallot.add(1); i += 1) { - expectedPostDoubleBallotWeight = expectedPostDoubleBallotWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId3, - expectedProjectId, - expectedFundingCycleNumber1 - .add(cycleCountDuringBallot) - .add(1) - .add(cycleCountDuringBallot) - .add(1), - expectedFundingCycleId1, - secondReconfigurationTimeMark, - cycleLimit2, - // one before. - expectedPostDoubleBallotWeight, - ballot2, - originalTimeMark.add( - duration1 - .mul(86400) - .mul(cycleCountDuringBallot.add(1)) - .mul(2) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - BigNumber.from(0), - expectedPackedMetadata2 - ] - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/limit.js b/packages/hardhat/test/integration/workflows/limit.js deleted file mode 100644 index 3effad1a5b..0000000000 --- a/packages/hardhat/test/integration/workflows/limit.js +++ /dev/null @@ -1,835 +0,0 @@ -/** - A funding cycle configuration can have a limit, after which the projects reverts to the previous configuration. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: - "Setting a limit on the first deployed funding cycle shouldnt do anything", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - const expectedProjectId = incrementProjectIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target1 = randomBigNumberFn({ min: amountToTap.mul(2) }); - - const duration1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - const cycleLimit1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxCycleLimit - }); - - // dont allow non recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot1 = constants.AddressZero; - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - amountToTap - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1 - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInitialWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedInitialTapped = BigNumber.from(0); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - return { - originalTimeMark: timeMark, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - }; - } - }, - { - description: "Make a payment to the project to lock it in", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - getBalanceFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - } - }, - { - description: "Fastforward to just before the limit", - fn: async ({ - fastforwardFn, - BigNumber, - randomBigNumberFn, - local: { cycleLimit1, duration1 } - }) => { - // Can move within a day, with some room on the boundaries for time imprecision. - const buffer = randomBigNumberFn({ - min: BigNumber.from(5), - max: BigNumber.from(86395) - }); - await fastforwardFn( - cycleLimit1 - .mul(duration1) - .mul(86400) - .sub(buffer) - ); - return { buffer }; - } - }, - { - description: "Make sure the same funding cycle is current", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - target1, - cycleLimit1, - discountRate1, - ballot1, - duration1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedWeight = expectedInitialWeight; - for (let i = 0; i < cycleLimit1.sub(1); i += 1) { - expectedWeight = expectedWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - cycleLimit1.eq(1) ? expectedFundingCycleId1 : BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleLimit1.sub(1)), - cycleLimit1.eq(1) ? BigNumber.from(0) : expectedFundingCycleId1, - originalTimeMark, - // There should be one cycle limit left - BigNumber.from(1), - expectedWeight, - ballot1, - originalTimeMark.add( - cycleLimit1 - .sub(1) - .mul(duration1) - .mul(86400) - ), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - } - }, - { - description: "Fastforward to past the limit", - fn: async ({ fastforwardFn, local: { buffer } }) => fastforwardFn(buffer) - }, - { - description: "Make sure the same funding cycle is current", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - target1, - cycleLimit1, - discountRate1, - ballot1, - duration1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedFullLimitWeight = expectedInitialWeight; - for (let i = 0; i < cycleLimit1; i += 1) { - expectedFullLimitWeight = expectedFullLimitWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - } - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleLimit1), - expectedFundingCycleId1, - originalTimeMark, - // Cycle limit should be 0 for the first funding cycle. - BigNumber.from(0), - expectedFullLimitWeight, - ballot1, - originalTimeMark.add(cycleLimit1.mul(duration1).mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - return { expectedFullLimitWeight }; - } - }, - { - description: "Reconfigure the project to have a limit", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { owner, expectedProjectId } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - const target2 = randomBigNumberFn(); - - const currency2 = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - const cycleLimit2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxCycleLimit - }); - // dont allow non recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId2, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - }; - } - }, - { - description: "Fastforward to just before the reconfiguration", - fn: async ({ fastforwardFn, timeMark, local: { duration1, buffer } }) => { - await fastforwardFn(duration1.mul(86400).sub(buffer)); - return { configurationTimeMark: timeMark }; - } - }, - { - description: "Make sure the same funding cycle is current", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - target1, - cycleLimit1, - discountRate1, - ballot1, - duration1, - expectedPackedMetadata1, - expectedFullLimitWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleLimit1), - expectedFundingCycleId1, - originalTimeMark, - // Cycle limit should be 0 for the first funding cycle. - BigNumber.from(0), - expectedFullLimitWeight, - ballot1, - originalTimeMark.add(cycleLimit1.mul(duration1).mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "Fastforward to the reconfiguration", - fn: async ({ fastforwardFn, local: { buffer } }) => fastforwardFn(buffer) - }, - { - description: "Make sure the configuration changed", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - originalTimeMark, - configurationTimeMark, - cycleLimit1, - discountRate1, - duration1, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2, - expectedFullLimitWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(cycleLimit1).add(1), - expectedFundingCycleId1, - configurationTimeMark, - cycleLimit2, - expectedFullLimitWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot2, - originalTimeMark.add( - cycleLimit1 - .add(1) - .mul(duration1) - .mul(86400) - ), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }); - - return { expectedPackedMetadata2, expectedFundingCycleId2 }; - } - }, - { - description: "Fastforward to next funding cycle in the limit", - fn: async ({ fastforwardFn, local: { duration2 } }) => - fastforwardFn(duration2.mul(86400)) - }, - { - description: "Make sure the limited configuration is still active", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleNumber1, - originalTimeMark, - configurationTimeMark, - cycleLimit1, - discountRate1, - duration1, - cycleLimit2, - discountRate2, - ballot2, - duration2, - target2, - currency2, - expectedPackedMetadata2, - expectedFundingCycleId2, - expectedFullLimitWeight, - expectedFee, - expectedInitialTapped - } - }) => { - if (cycleLimit2.lte(1)) return; - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(cycleLimit1).add(2), - expectedFundingCycleId2, - configurationTimeMark, - cycleLimit2.sub(1), - expectedFullLimitWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator) - .mul(constants.DiscountRatePercentDenominator.sub(discountRate2)) - .div(constants.DiscountRatePercentDenominator), - ballot2, - originalTimeMark - .add( - cycleLimit1 - .add(1) - .mul(duration1) - .mul(86400) - ) - .add(duration2.mul(86400)), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }); - } - }, - { - description: "Fastforward to after the limit", - fn: async ({ fastforwardFn, local: { cycleLimit2, duration2 } }) => { - if (cycleLimit2.lte(1)) return; - - await fastforwardFn( - cycleLimit2 - .sub(1) - .mul(duration2) - .mul(86400) - ); - } - }, - { - description: - "Make sure the permanent funding cycle is back to being the current", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - target1, - cycleLimit1, - discountRate1, - ballot1, - duration1, - cycleLimit2, - discountRate2, - duration2, - expectedPackedMetadata1, - expectedFullLimitWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedFullLimitWeight2 = expectedFullLimitWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - for (let i = 0; i < cycleLimit2; i += 1) { - expectedFullLimitWeight2 = expectedFullLimitWeight2 - .mul(constants.DiscountRatePercentDenominator.sub(discountRate2)) - .div(constants.DiscountRatePercentDenominator); - } - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1 - .add(cycleLimit1) - .add(cycleLimit2) - .add(1), - expectedFundingCycleId1, - originalTimeMark, - BigNumber.from(0), - expectedFullLimitWeight2, - ballot1, - originalTimeMark - .add( - cycleLimit1 - .add(1) - .mul(duration1) - .mul(86400) - ) - .add(cycleLimit2.mul(duration2).mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - } - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - incrementFundingCycleIdFn, - local: { expectedProjectId, amountToTap } - }) => { - // Tapping at this point will create a new funding cycle. - const expectedFundingCycleId3 = incrementFundingCycleIdFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }); - - return { expectedFundingCycleId3 }; - } - }, - { - description: "Make sure the tapped funding cycle is the current", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId2, - expectedFundingCycleId3, - amountToTap, - expectedFundingCycleNumber1, - originalTimeMark, - target1, - cycleLimit1, - discountRate1, - ballot1, - duration1, - cycleLimit2, - discountRate2, - duration2, - expectedPackedMetadata1, - expectedFullLimitWeight, - expectedFee - } - }) => { - let expectedFullLimitWeight2 = expectedFullLimitWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator); - for (let i = 0; i < cycleLimit2; i += 1) { - expectedFullLimitWeight2 = expectedFullLimitWeight2 - .mul(constants.DiscountRatePercentDenominator.sub(discountRate2)) - .div(constants.DiscountRatePercentDenominator); - } - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId3, - expectedProjectId, - expectedFundingCycleNumber1 - .add(cycleLimit1) - .add(cycleLimit2) - .add(1), - expectedFundingCycleId2, - originalTimeMark, - BigNumber.from(0), - expectedFullLimitWeight2, - ballot1, - originalTimeMark - .add( - cycleLimit1 - .add(1) - .mul(duration1) - .mul(86400) - ) - .add(cycleLimit2.mul(duration2).mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - amountToTap, - expectedPackedMetadata1 - ] - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/migrate.js b/packages/hardhat/test/integration/workflows/migrate.js deleted file mode 100644 index 348e5344ce..0000000000 --- a/packages/hardhat/test/integration/workflows/migrate.js +++ /dev/null @@ -1,537 +0,0 @@ -/** - Projects that are relying on a terminal to receive payments and manage their funds - can migrate to new terminals, according to the following rules: - - - Governance must first allow migration to the new terminal. - - The old terminal can no longer receive funds or print tickets. - - All funds will migrate to the new terminal for users to tap and redeem tickets on. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project for the owner", - fn: async ({ - constants, - contracts, - BigNumber, - executeFn, - randomBigNumberFn, - randomBytesFn, - getBalanceFn, - randomSignerFn, - incrementProjectIdFn, - incrementFundingCycleIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project that will migrate. - const owner = randomSignerFn(); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Two payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - // Also make sure the first payment is well positive to make the test cases cleaner. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(1000), - max: (await getBalanceFn(payer.address)).div(100) - }); - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The project's funding cycle target will be less than the payment value. - const target = randomBigNumberFn({ - min: BigNumber.from(1), - // Arbitrarily divide by two so there will be plenty of overflow. - max: paymentValue1.div(2) - }); - - // Set a random percentage of tickets to reserve for the project owner. - // Arbitrarily it to under 50% to make sure funds aren't not all reserved. - const reservedRate = randomBigNumberFn({ - max: constants.MaxPercent.div(2) - }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - "", - { - target, - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - - return { - expectedProjectId, - owner, - payer, - target, - paymentValue1, - paymentValue2, - reservedRate - }; - } - }, - { - description: "Check that the terminal got set", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: contracts.terminalV1.address - }) - }, - { - description: "Make a payment to the project", - fn: async ({ - executeFn, - randomStringFn, - randomSignerFn, - randomBoolFn, - getBalanceFn, - contracts, - local: { payer, paymentValue1, expectedProjectId } - }) => { - // An account that will be distributed tickets in the first terminal, that will redeem in the second terminal. - const ticketBeneficiary = randomSignerFn(); - - // Get the initial balance of the jucier. - const initialTerminalV1Balance = await getBalanceFn( - contracts.terminalV1.address - ); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }); - - return { ticketBeneficiary, initialTerminalV1Balance }; - } - }, - { - description: "The terminal's balance should match the payment just made", - fn: ({ - contracts, - verifyBalanceFn, - local: { paymentValue1, initialTerminalV1Balance } - }) => - verifyBalanceFn({ - address: contracts.terminalV1.address, - expect: initialTerminalV1Balance.add(paymentValue1) - }) - }, - { - description: - "Make sure tickets can be redeemed successfully in this TerminalV1", - fn: async ({ - deployer, - contracts, - executeFn, - randomBigNumberFn, - randomAddressFn, - getBalanceFn, - randomBoolFn, - BigNumber, - local: { ticketBeneficiary, expectedProjectId, owner } - }) => { - // Get the total amount of tickets received by the ticket beneficiary. - const redeemableTicketsOfTicketBeneficiary = await contracts.ticketBooth.balanceOf( - ticketBeneficiary.address, - expectedProjectId - ); - - // Redeem a portion of the total. - const portionOfRedeemableTicketsOfTicketBeneficiary = redeemableTicketsOfTicketBeneficiary.div( - randomBigNumberFn({ min: BigNumber.from(2), max: BigNumber.from(5) }) - ); - - // An address that will be the beneficiary of funds when redeeming tickets. - // Exclude the ticket beneficiary, owner, and deployer to make test cases cleaner. These accounts need to spend gas still. - const redeemBeneficiary = randomAddressFn({ - exclude: [ticketBeneficiary.address, owner.address, deployer.address] - }); - - const initialBalanceOfRedeemBeneficiary = await getBalanceFn( - redeemBeneficiary - ); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - // Redeem half as many tickets as are available. The rest will be redeemed later. - args: [ - ticketBeneficiary.address, - expectedProjectId, - portionOfRedeemableTicketsOfTicketBeneficiary, - 0, // must be lower than the expected amount of ETH that is being claimed. - redeemBeneficiary, - randomBoolFn() - ] - }); - - return { - leftoverRedeemableTicketsOfTicketBeneficiary: redeemableTicketsOfTicketBeneficiary.sub( - portionOfRedeemableTicketsOfTicketBeneficiary - ), - redeemBeneficiary, - initialBalanceOfRedeemBeneficiary - }; - } - }, - { - description: - "Make sure funds can be tapped successfully in this TerminalV1", - fn: async ({ - contracts, - BigNumber, - executeFn, - randomBigNumberFn, - randomSignerFn, - local: { expectedProjectId, target, redeemBeneficiary } - }) => { - // Initially tap a portion of the funding cycle's target. - const amountToTap1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: target.sub(1) - }); - - await executeFn({ - // Exclude the redeem beneficiary to not spend gas from that account. - caller: randomSignerFn({ exclude: [redeemBeneficiary] }), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap1, currency, amountToTap1] - }); - - return { amountToTap1 }; - } - }, - { - description: - "Migrating to a new terminalV1 shouldn't work because it hasn't been allowed yet", - fn: async ({ - contracts, - executeFn, - deployContractFn, - local: { owner, expectedProjectId } - }) => { - // The terminalV1 that will be migrated to. - const secondTerminalV1 = await deployContractFn("TerminalV1", [ - contracts.projects.address, - contracts.fundingCycles.address, - contracts.ticketBooth.address, - contracts.operatorStore.address, - contracts.modStore.address, - contracts.prices.address, - contracts.terminalDirectory.address, - contracts.governance.address - ]); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, secondTerminalV1.address], - revert: "TerminalV1::migrate: NOT_ALLOWED" - }); - - return { secondTerminalV1 }; - } - }, - { - description: "Allow a migration to the new terminalV1", - fn: ({ deployer, contracts, executeFn, local: { secondTerminalV1 } }) => - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "allowMigration", - args: [contracts.terminalV1.address, secondTerminalV1.address] - }) - }, - { - description: - "Migrating to the new terminalV1 called by a different address shouldn't be allowed", - fn: ({ - contracts, - executeFn, - randomSignerFn, - local: { owner, expectedProjectId, secondTerminalV1, redeemBeneficiary } - }) => - executeFn({ - // Also exlude the redeemBeneficary to not spend gas from that account. - caller: randomSignerFn({ - exclude: [owner.address, redeemBeneficiary] - }), - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, secondTerminalV1.address], - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: - "Migrate to the new terminalV1, which should automatically print reserved tickets for the owner", - fn: async ({ - contracts, - executeFn, - local: { owner, expectedProjectId, secondTerminalV1, reservedRate } - }) => { - // Before migrating, save a reference to the amount of reserved tickets available. - const reservedTicketAmount = await contracts.terminalV1.reservedTicketBalanceOf( - expectedProjectId, - reservedRate - ); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, secondTerminalV1.address] - }); - - return { reservedTicketAmount }; - } - }, - { - description: - "The only balance that should be left in the old terminalV1 is the admin fee incurred while tapping", - fn: async ({ - constants, - contracts, - verifyBalanceFn, - local: { amountToTap1, initialTerminalV1Balance } - }) => { - // The percent, out of `constants.MaxPercent`, that will be charged as a fee. - const fee = await contracts.terminalV1.fee(); - - await verifyBalanceFn({ - address: contracts.terminalV1.address, - // Take the fee from the amount that was tapped. - expect: initialTerminalV1Balance - .add(amountToTap1) - .sub( - amountToTap1 - .mul(constants.MaxPercent) - .div(constants.MaxPercent.add(fee)) - ) - }); - } - }, - { - description: - "The rest of the balance should be entirely in the new TerminalV1", - fn: async ({ - verifyBalanceFn, - getBalanceFn, - local: { - paymentValue1, - redeemBeneficiary, - amountToTap1, - secondTerminalV1, - initialBalanceOfRedeemBeneficiary - } - }) => - verifyBalanceFn({ - address: secondTerminalV1.address, - // The balance should be the amount paid minus the amount tapped and the amount claimed from redeeming tickets. - expect: paymentValue1 - .sub(amountToTap1) - .sub( - (await getBalanceFn(redeemBeneficiary)).sub( - initialBalanceOfRedeemBeneficiary - ) - ) - }) - }, - { - description: - "The terminal should have been updated to the new terminalV1 in the directory", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, secondTerminalV1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: secondTerminalV1.address - }) - }, - { - description: "Payments to the old TerminalV1 should no longer be accepted", - fn: ({ - contracts, - executeFn, - randomAddressFn, - randomBoolFn, - randomStringFn, - local: { payer, paymentValue2, expectedProjectId } - }) => - executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2, - revert: "TerminalUtility: UNAUTHORIZED" - }) - }, - { - description: - "Make sure funds can be tapped successfully in the new TerminalV1", - fn: ({ - executeFn, - randomSignerFn, - local: { target, expectedProjectId, amountToTap1, secondTerminalV1 } - }) => - executeFn({ - caller: randomSignerFn(), - contract: secondTerminalV1, - fn: "tap", - args: [ - expectedProjectId, - target.sub(amountToTap1), - currency, - target.sub(amountToTap1) - ] - }) - }, - { - description: - "Make sure tickets can be redeemed successfully in the new TerminalV1", - fn: ({ - executeFn, - randomAddressFn, - randomBoolFn, - local: { - leftoverRedeemableTicketsOfTicketBeneficiary, - ticketBeneficiary, - expectedProjectId, - secondTerminalV1 - } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: secondTerminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - leftoverRedeemableTicketsOfTicketBeneficiary, - 0, // must be lower than the expected amount of ETH that is being claimed. - randomAddressFn(), - randomBoolFn() - ] - }) - }, - { - description: "Make sure the owner can also redeem their tickets", - fn: ({ - executeFn, - randomAddressFn, - randomBoolFn, - local: { - reservedTicketAmount, - owner, - reservedRate, - expectedProjectId, - secondTerminalV1 - } - }) => - executeFn({ - caller: owner, - contract: secondTerminalV1, - fn: "redeem", - args: [ - owner.address, - expectedProjectId, - reservedTicketAmount, - 0, // must be lower than the expected amount of ETH that is being claimed. - randomAddressFn(), - randomBoolFn() - ], - revert: reservedRate.eq(0) && "TerminalV1::redeem: NO_OP" - }) - }, - { - description: "Payments to the new TerminalV1 should be accepted", - fn: ({ - executeFn, - randomAddressFn, - randomBoolFn, - randomStringFn, - local: { payer, paymentValue2, expectedProjectId, secondTerminalV1 } - }) => - executeFn({ - caller: payer, - contract: secondTerminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2 - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/non_recurring.js b/packages/hardhat/test/integration/workflows/non_recurring.js deleted file mode 100644 index 73d2a0681d..0000000000 --- a/packages/hardhat/test/integration/workflows/non_recurring.js +++ /dev/null @@ -1,549 +0,0 @@ -/** - A funding cycle configuration can have a discount rate of of 0. This makes it non recurring. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project with a discount rate of 0", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - const expectedProjectId = incrementProjectIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target1 = randomBigNumberFn({ min: amountToTap.mul(2) }); - - const duration1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - const cycleLimit1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxCycleLimit - }); - - const discountRate1 = BigNumber.from(constants.MaxDiscountRate); - - const ballot1 = constants.AddressZero; - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - amountToTap - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1 - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInitialWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedInitialTapped = BigNumber.from(0); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - return { - originalTimeMark: timeMark, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - }; - } - }, - { - description: "The funding cycle should be current", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "There should be no queued cycle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - constants.AddressZero, - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0) - ] - }) - }, - { - description: - "Reconfiguring the project should still be possible before a payment is made", - fn: async ({ - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - constants, - local: { - owner, - expectedProjectId, - target1, - cycleLimit1, - ballot1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1 - } - }) => { - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target1, - currency, - duration: duration2, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - return { duration2 }; - } - }, - { - description: "Make a payment to the project to lock it in", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - getBalanceFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - } - }, - { - description: "Reconfiguring the project shouldn't be possible", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ max: constants.MaxPercent }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ], - revert: "FundingCycles::_configurable: NON_RECURRING" - }) - }, - { - description: "Fastforward a after the duration", - fn: async ({ fastforwardFn, local: { duration2 } }) => - fastforwardFn(duration2.mul(86400)) - }, - { - description: "There should be no current cycle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - constants.AddressZero, - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0) - ] - }) - }, - { - description: "There should be no queued cycle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - constants.AddressZero, - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0) - ] - }) - }, - { - description: "Shouldnt be tappable", - fn: ({ - contracts, - executeFn, - randomSignerFn, - BigNumber, - local: { expectedProjectId } - }) => - executeFn({ - // Dont use the owner or address mod beneficiary or else the gas spent will mess up the calculation. - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [ - expectedProjectId, - BigNumber.from(1), - currency, - BigNumber.from(0) - ], - revert: "FundingCycles::_tappable: NON_RECURRING" - }) - }, - { - description: "Reconfiguring the project still shouldn't work", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ max: constants.MaxPercent }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ], - revert: "FundingCycles::_configurable: NON_RECURRING" - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/operator_permissions.js b/packages/hardhat/test/integration/workflows/operator_permissions.js deleted file mode 100644 index eeb523e94b..0000000000 --- a/packages/hardhat/test/integration/workflows/operator_permissions.js +++ /dev/null @@ -1,906 +0,0 @@ -/** - Project owners can give an operator permission - to do certain things on their behalf. - - Test to make sure each function that can be operated - handles authorization correctly. -*/ -const operations = [ - { - expand: ({ - BigNumber, - contracts, - constants, - local: { expectedProjectId } - }) => ({ - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: BigNumber.from(1000), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(1), - ballot: constants.AddressZero - }, - { - reservedRate: BigNumber.from(201), - bondingCurveRate: BigNumber.from(1), - reconfigurationBondingCurveRate: BigNumber.from(1) - }, - [], - [] - ], - domain: expectedProjectId, - permissionIndex: 1, - authorizedRevert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RESERVED_RATE" - }) - }, - { - expand: ({ - contracts, - BigNumber, - constants, - local: { expectedProjectId } - }) => ({ - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - BigNumber.from(1000), - BigNumber.from(0), - constants.AddressZero, - "", - false - ], - domain: expectedProjectId, - permissionIndex: 2, - authorizedRevert: "TerminalV1::printTickets: ZERO_ADDRESS" - }) - }, - { - expand: ({ - contracts, - BigNumber, - constants, - local: { expectedProjectId, owner } - }) => ({ - contract: contracts.terminalV1, - fn: "redeem", - args: [ - owner.address, - expectedProjectId, - BigNumber.from(1), - BigNumber.from(0), - constants.AddressZero, - true - ], - domain: expectedProjectId, - permissionIndex: 3, - authorizedRevert: "TerminalV1::redeem: ZERO_ADDRESS" - }) - }, - { - expand: ({ contracts, constants, local: { expectedProjectId } }) => ({ - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, constants.AddressZero], - domain: expectedProjectId, - permissionIndex: 4, - authorizedRevert: "TerminalV1::migrate: NOT_ALLOWED" - }) - }, - { - expand: ({ contracts, stringToBytes, local: { expectedProjectId } }) => ({ - contract: contracts.projects, - fn: "setHandle", - args: [expectedProjectId, stringToBytes("")], - domain: expectedProjectId, - permissionIndex: 5, - authorizedRevert: "Projects::setHandle: EMPTY_HANDLE" - }) - }, - { - expand: ({ contracts, local: { expectedProjectId } }) => ({ - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, ""], - domain: expectedProjectId, - permissionIndex: 6 - }) - }, - { - expand: ({ - contracts, - constants, - stringToBytes, - local: { expectedProjectId } - }) => ({ - contract: contracts.projects, - fn: "transferHandle", - args: [expectedProjectId, constants.AddressZero, stringToBytes("")], - domain: expectedProjectId, - permissionIndex: 5, - authorizedRevert: "Projects::transferHandle: EMPTY_HANDLE" - }) - }, - { - override: [ - { - description: "Unauthorized if claiming for a different account", - fn: ({ - executeFn, - contracts, - randomBytesFn, - randomAddressFn, - local: { owner, operator, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "claimHandle", - args: [ - randomBytesFn(), - randomAddressFn({ exclude: [owner.address, operator.address] }), - expectedProjectId - ], - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "Authorized if claiming for owner account", - fn: ({ - executeFn, - contracts, - randomBytesFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "claimHandle", - args: [randomBytesFn(), owner.address, expectedProjectId], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: "The operator should not have permission", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { owner, expectedProjectId, operator } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, owner.address, expectedProjectId, [7]], - expect: false - }) - }, - { - description: "Set the operator on the owner", - fn: ({ - executeFn, - contracts, - local: { owner, expectedProjectId, operator } - }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, expectedProjectId, [7]] - }) - }, - { - description: "The operator should now have permission", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { owner, expectedProjectId, operator } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, owner.address, expectedProjectId, [7]], - expect: true - }) - }, - { - description: "The operator should not have permission over the claimer", - fn: ({ - checkFn, - contracts, - randomAddressFn, - randomSignerFn, - local: { expectedProjectId, owner, operator } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - randomAddressFn({ exclude: [owner.address, operator.address] }), - expectedProjectId, - [7] - ], - expect: false - }) - }, - { - description: "Set the operator on the claimer", - fn: async ({ - executeFn, - contracts, - randomSignerFn, - local: { expectedProjectId, operator, owner } - }) => { - const claimer = randomSignerFn({ - exclude: [owner.address, operator.address] - }); - await executeFn({ - caller: claimer, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, expectedProjectId, [7]] - }); - return { claimer }; - } - }, - { - description: "The operator should now have permission over the claimer", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { expectedProjectId, operator, claimer } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, claimer.address, expectedProjectId, [7]], - expect: true - }) - }, - { - description: "The operator should have permissions", - fn: ({ - executeFn, - contracts, - randomBytesFn, - local: { expectedProjectId, operator, claimer } - }) => - executeFn({ - caller: operator, - contract: contracts.projects, - fn: "claimHandle", - args: [randomBytesFn(), claimer.address, expectedProjectId], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: "Get rid of the permission from the projects domain", - fn: ({ - executeFn, - contracts, - local: { expectedProjectId, operator, claimer } - }) => - executeFn({ - caller: claimer, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, expectedProjectId, []] - }) - }, - { - description: "The operator should not have permission over the claimer", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { expectedProjectId, operator, claimer } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, claimer.address, expectedProjectId, [7]], - expect: false - }) - }, - { - description: - "The operator should not have permission over the claimer's wildcard", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { operator, claimer } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, claimer.address, 0, [7]], - expect: false - }) - }, - { - description: "Add the permission to the wildcard domain", - fn: ({ executeFn, contracts, local: { operator, claimer } }) => - executeFn({ - caller: claimer, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, 0, [7]] - }) - }, - { - description: - "The operator should now have permission over the claimer's wildcard", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { operator, claimer } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, claimer.address, 0, [7]], - expect: true - }) - }, - { - description: "The operator should still have permissions", - fn: ({ - executeFn, - contracts, - randomBytesFn, - local: { expectedProjectId, operator, claimer } - }) => - executeFn({ - caller: operator, - contract: contracts.projects, - fn: "claimHandle", - args: [randomBytesFn(), claimer.address, expectedProjectId], - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: "A non-owner or operator account shouldnt be authorized", - fn: ({ - executeFn, - contracts, - randomBytesFn, - randomSignerFn, - local: { expectedProjectId, owner, operator, claimer } - }) => - executeFn({ - caller: randomSignerFn({ - exclude: [owner.address, operator.address] - }), - contract: contracts.projects, - fn: "claimHandle", - args: [randomBytesFn(), claimer.address, expectedProjectId], - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "Remove permissions from the operator", - fn: ({ executeFn, contracts, local: { claimer, operator } }) => - executeFn({ - caller: claimer, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, 0, []] - }) - }, - { - description: - "The operator should not have permission over the claimer's wildcard", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { operator, claimer } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [operator.address, claimer.address, 0, [7]], - expect: false - }) - }, - { - description: "Operator should no longer have permission", - fn: ({ - executeFn, - contracts, - randomBytesFn, - local: { expectedProjectId, operator, claimer } - }) => - executeFn({ - caller: operator, - contract: contracts.projects, - fn: "claimHandle", - args: [randomBytesFn(), claimer.address, expectedProjectId], - revert: "Operatable: UNAUTHORIZED" - }) - } - ] - }, - { - expand: ({ contracts, local: { expectedProjectId } }) => ({ - contract: contracts.projects, - fn: "renewHandle", - args: [expectedProjectId], - domain: expectedProjectId, - permissionIndex: 8 - }) - }, - { - expand: ({ contracts, local: { expectedProjectId } }) => ({ - contract: contracts.ticketBooth, - fn: "issue", - args: [expectedProjectId, "", ""], - domain: expectedProjectId, - permissionIndex: 9, - authorizedRevert: "TicketBooth::issue: EMPTY_NAME" - }) - }, - { - expand: ({ - contracts, - BigNumber, - local: { owner, expectedProjectId } - }) => ({ - contract: contracts.ticketBooth, - fn: "stake", - args: [owner.address, expectedProjectId, BigNumber.from(1)], - domain: expectedProjectId, - permissionIndex: 10, - authorizedRevert: "TicketBooth::stake: NOT_FOUND" - }), - allowWildcard: true - }, - { - expand: ({ - contracts, - BigNumber, - local: { owner, expectedProjectId } - }) => ({ - contract: contracts.ticketBooth, - fn: "unstake", - args: [owner.address, expectedProjectId, BigNumber.from(1)], - domain: expectedProjectId, - permissionIndex: 11, - authorizedRevert: "TicketBooth::unstake: NOT_FOUND" - }), - allowWildcard: true - }, - { - expand: ({ - contracts, - BigNumber, - constants, - local: { owner, expectedProjectId } - }) => ({ - contract: contracts.ticketBooth, - fn: "transfer", - args: [ - owner.address, - expectedProjectId, - BigNumber.from(1), - constants.AddressZero - ], - domain: expectedProjectId, - permissionIndex: 12, - authorizedRevert: "TicketBooth::transfer: ZERO_ADDRESS" - }), - allowWildcard: true - }, - { - expand: ({ - contracts, - BigNumber, - local: { owner, expectedProjectId } - }) => ({ - contract: contracts.ticketBooth, - fn: "lock", - args: [owner.address, expectedProjectId, BigNumber.from(0)], - domain: expectedProjectId, - permissionIndex: 13, - authorizedRevert: "TicketBooth::lock: NO_OP" - }), - allowWildcard: true - }, - // TerminalV1 calls to set payout mods and ticket mods are checked throughout other integration tests. - { - expand: ({ contracts, BigNumber, local: { expectedProjectId } }) => ({ - contract: contracts.modStore, - fn: "setPayoutMods", - args: [expectedProjectId, BigNumber.from(0), []], - domain: expectedProjectId, - permissionIndex: 14, - authorizedRevert: "ModStore::setPayoutMods: NO_OP" - }) - }, - { - expand: ({ contracts, BigNumber, local: { expectedProjectId } }) => ({ - contract: contracts.modStore, - fn: "setTicketMods", - args: [expectedProjectId, BigNumber.from(0), []], - domain: expectedProjectId, - permissionIndex: 15, - authorizedRevert: "ModStore::setTicketMods: NO_OP" - }) - }, - // The other allow cases are tested in various other integration tests. - { - expand: ({ contracts, constants, local: { expectedProjectId } }) => ({ - contract: contracts.terminalDirectory, - fn: "setTerminal", - args: [expectedProjectId, constants.AddressZero], - domain: expectedProjectId, - permissionIndex: 16, - authorizedRevert: "TerminalDirectory::setTerminal: UNAUTHORIZED", - revert: "TerminalDirectory::setTerminal: UNAUTHORIZED" - }) - } -]; - -module.exports = [ - // For each operation, test owner access, operator access, and unauthorized access. - ...operations.reduce((all, { pre = [], expand, override, allowWildcard }) => { - return [ - ...all, - { - description: "Create a project", - fn: async ({ - executeFn, - randomBytesFn, - randomSignerFn, - contracts, - randomStringFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // The address that will own a project. - const owner = randomSignerFn(); - - // The address that will operate a project. - const operator = randomSignerFn({ exclude: [owner.address] }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - contracts.terminalV1.address - ] - }); - - return { expectedProjectId, owner, operator }; - } - }, - ...pre, - { - description: "Load op", - fn: params => { - const { - contract, - fn, - args, - domain, - authorizedRevert, - revert, - permissionIndex - } = expand ? expand(params) : {}; - - return { - contract, - fn, - args, - domain, - authorizedRevert, - revert, - permissionIndex, - allowWildcard, - override, - pre - }; - } - }, - ...(override || [ - { - description: "Operator shouldnt have permission at first", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { operator, domain, permissionIndex, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - domain, - [permissionIndex] - ], - expect: false - }) - }, - { - description: "The owner should be authorized", - fn: ({ - executeFn, - local: { owner, contract, fn, args, authorizedRevert } - }) => - executeFn({ - caller: owner, - contract, - fn, - args, - revert: authorizedRevert - }) - }, - { - description: "At permissions to the operator on the domain", - fn: ({ - executeFn, - contracts, - local: { operator, domain, owner, permissionIndex } - }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, domain, [permissionIndex]] - }) - }, - { - description: "The operator should now have permission", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { operator, domain, owner, permissionIndex } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - domain, - [permissionIndex] - ], - expect: true - }) - }, - { - description: "Operator should be authorized", - fn: ({ - executeFn, - local: { operator, contract, fn, args, authorizedRevert } - }) => - executeFn({ - caller: operator, - contract, - fn, - args, - revert: authorizedRevert - }) - }, - // Check for wildcard authorization if needed. - ...(allowWildcard - ? [ - { - description: "Remove the operator's permission from domain", - fn: ({ - executeFn, - contracts, - local: { operator, owner, domain } - }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, domain, []] - }) - }, - { - description: - "The operator should no longer have permission over this domain", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { operator, domain, owner, permissionIndex } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - domain, - [permissionIndex] - ], - expect: false - }) - }, - { - description: "Give the operator permission over the wildcard", - fn: ({ - executeFn, - contracts, - local: { operator, owner, permissionIndex } - }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, 0, [permissionIndex]] - }) - }, - { - description: - "The operator should now have permission over the wildcard", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { operator, owner, permissionIndex } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - 0, - [permissionIndex] - ], - expect: true - }) - }, - { - description: "Should still be authorized", - fn: ({ - executeFn, - local: { operator, contract, fn, args, authorizedRevert } - }) => - executeFn({ - caller: operator, - contract, - fn, - args, - revert: authorizedRevert - }) - }, - { - description: "Remove permission from wildcard", - fn: ({ executeFn, contracts, local: { operator, owner } }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, 0, []] - }) - }, - { - description: - "The operator should no longer have permission over the wildcard", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { operator, permissionIndex, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - 0, - [permissionIndex] - ], - expect: false - }) - } - ] - : []), - { - description: "A non-owner or operator account shouldnt be authorized", - fn: ({ - executeFn, - randomSignerFn, - local: { contract, fn, args, revert, owner, operator } - }) => - executeFn({ - caller: randomSignerFn({ - exclude: [owner.address, operator.address] - }), - contract, - fn, - args, - revert: revert || "Operatable: UNAUTHORIZED" - }) - }, - { - description: "Remove all permissions from operator for domain", - fn: ({ executeFn, contracts, local: { operator, domain, owner } }) => - executeFn({ - caller: owner, - contract: contracts.operatorStore, - fn: "setOperator", - args: [operator.address, domain, []] - }) - }, - { - description: - "The operator should no longer have permission over this domain", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { operator, domain, permissionIndex, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.operatorStore, - fn: "hasPermission", - args: [ - operator.address, - owner.address, - domain, - [permissionIndex] - ], - expect: false - }) - }, - { - description: "Operator should no longer be authorized", - fn: ({ - executeFn, - local: { operator, contract, fn, args, revert } - }) => - executeFn({ - caller: operator, - contract, - fn, - args, - revert: revert || "Operatable: UNAUTHORIZED" - }) - } - ]) - ]; - }, []) -]; diff --git a/packages/hardhat/test/integration/workflows/print_premined_tickets.js b/packages/hardhat/test/integration/workflows/print_premined_tickets.js deleted file mode 100644 index 5f558ae3eb..0000000000 --- a/packages/hardhat/test/integration/workflows/print_premined_tickets.js +++ /dev/null @@ -1,610 +0,0 @@ -/** - A project can print premined tickets up until the point when a payment is made to it after its configured its first funding cycle. -*/ - -// The currency will be 0, which corresponds to ETH. -const currency = 0; - -module.exports = [ - { - description: "Create a project", - fn: async ({ - executeFn, - randomStringFn, - contracts, - randomBytesFn, - randomSignerFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - contracts.terminalV1.address - ] - }); - - return { owner, expectedProjectId }; - } - }, - { - description: "The project should still be able to print premined tickets", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "canPrintPreminedTickets", - args: [expectedProjectId], - expect: true - }) - }, - { - description: "Print some premined tickets", - fn: async ({ - randomSignerFn, - randomBoolFn, - randomBigNumberFn, - BigNumber, - executeFn, - contracts, - randomStringFn, - local: { owner, expectedProjectId } - }) => { - // The address that will receive the first batch of preconfigure tickets. - const preconfigureTicketBeneficiary1 = randomSignerFn(); - - // The first amount of premined tickets to print. - const preminePrintAmount1 = randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - preminePrintAmount1, - currency, - preconfigureTicketBeneficiary1.address, - randomStringFn(), - randomBoolFn() - ] - }); - - return { - preconfigureTicketBeneficiary1, - preminePrintAmount1 - }; - } - }, - { - description: - "The beneficiary should have gotten the correct amount of tickets", - fn: async ({ - randomSignerFn, - constants, - checkFn, - contracts, - local: { - preconfigureTicketBeneficiary1, - preminePrintAmount1, - expectedProjectId - } - }) => { - // The ticket amount is based on the initial funding cycle's weight. - const expectedPreminedPrintedTicketAmount1 = preminePrintAmount1.mul( - constants.InitialWeightMultiplier - ); - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [preconfigureTicketBeneficiary1.address, expectedProjectId], - expect: expectedPreminedPrintedTicketAmount1 - }); - - return { expectedPreminedPrintedTicketAmount1 }; - } - }, - { - description: "All the tickets should be staked", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { - expectedProjectId, - preconfigureTicketBeneficiary1, - expectedPreminedPrintedTicketAmount1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [preconfigureTicketBeneficiary1.address, expectedProjectId], - expect: expectedPreminedPrintedTicketAmount1 - }) - }, - { - description: - "The project should still be allowed to print more premined tickets", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "canPrintPreminedTickets", - args: [expectedProjectId], - expect: true - }) - }, - { - description: "Make a payment before configuring a funding cycle", - fn: async ({ - randomSignerFn, - randomBigNumberFn, - BigNumber, - getBalanceFn, - executeFn, - contracts, - randomStringFn, - randomBoolFn, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The address that will receive the second batch of preconfigure tickets. - const preconfigureTicketBeneficiary2 = randomSignerFn(); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - preconfigureTicketBeneficiary2.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }); - - return { - payer, - paymentValue1, - preconfigureTicketBeneficiary2 - }; - } - }, - { - description: - "The payment beneficiary should have gotten the correct amount of tickets", - fn: async ({ - randomSignerFn, - checkFn, - contracts, - constants, - local: { - preconfigureTicketBeneficiary1, - preconfigureTicketBeneficiary2, - expectedPreminedPrintedTicketAmount1, - expectedProjectId, - paymentValue1 - } - }) => { - // The ticket amount is based on the initial funding cycle's weight. - const expectedPaymentPrintedTicketAmount1 = paymentValue1.mul( - constants.InitialWeightMultiplier - ); - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [preconfigureTicketBeneficiary2.address, expectedProjectId], - // If the beneficiaries receiving the first premine tickets and the first payment tickets are the same, add them up. - expect: expectedPaymentPrintedTicketAmount1.add( - preconfigureTicketBeneficiary2.address === - preconfigureTicketBeneficiary1.address - ? expectedPreminedPrintedTicketAmount1 - : 0 - ) - }); - return { expectedPaymentPrintedTicketAmount1 }; - } - }, - { - description: "All the tickets should still be staked", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { - expectedProjectId, - preconfigureTicketBeneficiary1, - preconfigureTicketBeneficiary2, - expectedPaymentPrintedTicketAmount1, - expectedPreminedPrintedTicketAmount1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [preconfigureTicketBeneficiary2.address, expectedProjectId], - expect: expectedPaymentPrintedTicketAmount1.add( - preconfigureTicketBeneficiary2.address === - preconfigureTicketBeneficiary1.address - ? expectedPreminedPrintedTicketAmount1 - : 0 - ) - }) - }, - { - description: - "The project should still be able to print more premined tickets", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "canPrintPreminedTickets", - args: [expectedProjectId], - expect: true - }) - }, - { - description: - "Issue the project's tickets so that the unstaked preference can be checked", - fn: ({ - executeFn, - contracts, - randomStringFn, - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedProjectId, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: - "Configuring a funding cycle. This shouldn't affect the ability for project to keep printing premined tickets", - fn: async ({ - executeFn, - contracts, - randomBigNumberFn, - constants, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner } - }) => { - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ max: constants.MaxPercent }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - } - }, - { - description: "Print some more premined tickets to another beneficiary", - fn: async ({ - randomBigNumberFn, - executeFn, - BigNumber, - randomBoolFn, - randomSignerFn, - randomStringFn, - contracts, - local: { expectedProjectId, owner } - }) => { - // The address that will receive the second batch of premined tickets. - const preconfigureTicketBeneficiary3 = randomSignerFn(); - - const preminePrintAmount2 = randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }); - - // The unsrtaked preference to use. - const preferUnstakedTickets = randomBoolFn(); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - preminePrintAmount2, - currency, - preconfigureTicketBeneficiary3.address, - randomStringFn(), - preferUnstakedTickets - ] - }); - - return { - preconfigureTicketBeneficiary3, - preminePrintAmount2, - preferUnstakedTickets - }; - } - }, - { - description: - "The third beneficiary should have gotten the correct amount of tickets", - fn: async ({ - randomSignerFn, - constants, - checkFn, - contracts, - local: { - expectedProjectId, - preconfigureTicketBeneficiary1, - preconfigureTicketBeneficiary2, - preconfigureTicketBeneficiary3, - expectedPaymentPrintedTicketAmount1, - expectedPreminedPrintedTicketAmount1, - preminePrintAmount2 - } - }) => { - const expectedPreminedPrintedTicketAmount2 = preminePrintAmount2.mul( - constants.InitialWeightMultiplier - ); - - let expect = expectedPreminedPrintedTicketAmount2; - - // If the beneficiary is the same as the one which received tickets from the first premine, add the amounts. - if ( - preconfigureTicketBeneficiary3.address === - preconfigureTicketBeneficiary1.address - ) - expect = expect.add(expectedPreminedPrintedTicketAmount1); - - // If the beneficiary is the same as the one which received tickets from the first payment, add the amounts. - if ( - preconfigureTicketBeneficiary3.address === - preconfigureTicketBeneficiary2.address - ) - expect = expect.add(expectedPaymentPrintedTicketAmount1); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [preconfigureTicketBeneficiary3.address, expectedProjectId], - expect - }); - - return { expectedPreminedPrintedTicketAmount2 }; - } - }, - { - description: "Check for the correct number of staked tickets", - fn: async ({ - randomSignerFn, - checkFn, - contracts, - BigNumber, - local: { - expectedProjectId, - preconfigureTicketBeneficiary1, - preconfigureTicketBeneficiary2, - preconfigureTicketBeneficiary3, - expectedPreminedPrintedTicketAmount1, - expectedPreminedPrintedTicketAmount2, - expectedPaymentPrintedTicketAmount1, - preferUnstakedTickets - } - }) => { - let expectedStaked = preferUnstakedTickets - ? BigNumber.from(0) - : expectedPreminedPrintedTicketAmount2; - - // If the beneficiary is the same as the one which received tickets from the first premine, add the amounts. - if ( - preconfigureTicketBeneficiary3.address === - preconfigureTicketBeneficiary1.address - ) - expectedStaked = expectedStaked.add( - expectedPreminedPrintedTicketAmount1 - ); - - // If the beneficiary is the same as the one which received tickets from the first payment, add the amounts. - if ( - preconfigureTicketBeneficiary3.address === - preconfigureTicketBeneficiary2.address - ) - expectedStaked = expectedStaked.add( - expectedPaymentPrintedTicketAmount1 - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [preconfigureTicketBeneficiary3.address, expectedProjectId], - expect: expectedStaked - }); - } - }, - { - description: - "The total supply of tickets for the project should equal the total of the premined printed amounts", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { - expectedProjectId, - expectedPreminedPrintedTicketAmount1, - expectedPreminedPrintedTicketAmount2, - expectedPaymentPrintedTicketAmount1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "totalSupplyOf", - args: [expectedProjectId], - expect: expectedPreminedPrintedTicketAmount1 - .add(expectedPreminedPrintedTicketAmount2) - .add(expectedPaymentPrintedTicketAmount1) - }) - }, - { - description: - "Make a second payment to lock in the premined amount now that there's a configured funding cycle", - fn: async ({ - randomBigNumberFn, - BigNumber, - getBalanceFn, - executeFn, - contracts, - randomAddressFn, - randomStringFn, - randomBoolFn, - local: { expectedProjectId, payer } - }) => { - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2 - }); - } - }, - { - description: "Printing tickets should no longer allowed", - fn: ({ - randomSignerFn, - checkFn, - contracts, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "canPrintPreminedTickets", - args: [expectedProjectId], - expect: false - }) - }, - { - description: "Confirm that printing tickets is no longer allowed", - fn: async ({ - executeFn, - contracts, - randomBigNumberFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - BigNumber, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }), - currency, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - revert: "TerminalV1::printTickets: ALREADY_ACTIVE" - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/print_reserved_tickets.js b/packages/hardhat/test/integration/workflows/print_reserved_tickets.js deleted file mode 100644 index f5d54dd1b8..0000000000 --- a/packages/hardhat/test/integration/workflows/print_reserved_tickets.js +++ /dev/null @@ -1,880 +0,0 @@ -/** - Projects that have configured a reserve rate will be reserved tickets each time - a payment is made to it. - - These reserved tickets can be printed at any time. - - Any configured ticket mods will get sent some of the printing reserved tickets at this time. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Create a project", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - randomBytesFn, - randomStringFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // The owner of the project that will migrate. - const owner = randomSignerFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - // Set the terminalV1 to the terminal. - contracts.terminalV1.address - ] - }); - - return { expectedProjectId, owner }; - } - }, - { - description: - "Make a payment to the project. This shouldn't create any reserved tickets since a configuration hasn't yet been made for the project", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - randomBigNumberFn, - randomBoolFn, - randomStringFn, - getBalanceFn, - BigNumber, - local: { expectedProjectId, owner } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Three payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // An account that will be distributed tickets in the preconfig payment. - const preconfigTicketBeneficiary = randomSignerFn({ - exclude: [owner.address] - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - preconfigTicketBeneficiary.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }); - - return { payer, paymentValue1, preconfigTicketBeneficiary }; - } - }, - { - description: - "The preconfig ticket beneficiary should have tickets from the payment", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, paymentValue1, preconfigTicketBeneficiary } - }) => { - // The expected number of tickets to expect from the first payment. - const expectedPreminedPaidTicketAmount = paymentValue1.mul( - constants.InitialWeightMultiplier - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [preconfigTicketBeneficiary.address, expectedProjectId], - expect: expectedPreminedPaidTicketAmount - }); - - return { expectedPreminedPaidTicketAmount }; - } - }, - { - description: "Print some premined tickets to a beneficiary", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - randomBoolFn, - randomStringFn, - BigNumber, - local: { expectedProjectId, owner, preconfigTicketBeneficiary } - }) => { - // The first amount of premined tickets to print. The amount is currency-denominated, based on the weight of the first funding cycle. - const preminePrintAmount = randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - preminePrintAmount, - currency, - preconfigTicketBeneficiary.address, - randomStringFn(), - randomBoolFn() - ] - }); - - return { preminePrintAmount }; - } - }, - { - description: "There shouldn't be any reserved tickets", - fn: ({ - constants, - contracts, - checkFn, - randomBigNumberFn, - randomSignerFn, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [ - expectedProjectId, - randomBigNumberFn({ max: constants.MaxPercent }) - ], - expect: 0 - }) - }, - { - description: - "The preconfig ticket beneficiary should now also have tickets from the premine", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - preconfigTicketBeneficiary, - preminePrintAmount, - expectedPreminedPaidTicketAmount - } - }) => { - // The ticket amount is based on the initial funding cycle's weight. - const expectedPreminedPrintedTicketAmount = preminePrintAmount.mul( - constants.InitialWeightMultiplier - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [preconfigTicketBeneficiary.address, expectedProjectId], - expect: expectedPreminedPaidTicketAmount.add( - expectedPreminedPrintedTicketAmount - ) - }); - } - }, - { - description: "Configure the projects funding cycle", - fn: async ({ - constants, - contracts, - BigNumber, - executeFn, - getBalanceFn, - randomBigNumberFn, - randomBoolFn, - randomSignerFn, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner, payer, preconfigTicketBeneficiary } - }) => { - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - const paymentValue3 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - const target = randomBigNumberFn({ - max: paymentValue2.add(paymentValue3) - }); - - // Make recurring. - const duration = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - // An account that will be distributed tickets in mod1. - // Simplify the test by disallowing the owner or the preconfig ticket beneficiary. - const mod1Beneficiary = randomSignerFn({ - exclude: [owner.address, preconfigTicketBeneficiary.address] - }); - - // The mod percents should add up to <= constants.MaxPercent. - const percent1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.sub(2) - }); - const percent2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.sub(percent1).sub(1) - }); - - // The preference for unstaked tickets. - const preferUnstaked = randomBoolFn(); - - // Add two ticket mods. - const mod1 = { - preferUnstaked, - percent: percent1.toNumber(), - lockedUntil: 0, - beneficiary: mod1Beneficiary.address - }; - - // An account that will be distributed tickets in mod2. - // Simplify the test by disallowing the owner, the preconfig ticket beneficiary, or the first mod beneficiary. - const mod2Beneficiary = randomSignerFn({ - exclude: [ - owner.address, - preconfigTicketBeneficiary.address, - mod1Beneficiary.address - ] - }); - - const mod2 = { - preferUnstaked, - percent: percent2.toNumber(), - lockedUntil: 0, - beneficiary: mod2Beneficiary.address - }; - - // Set a random percentage of tickets to reserve for the project owner. - const reservedRate = randomBigNumberFn({ max: constants.MaxPercent }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target, - currency, - duration, - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [mod1, mod2] - ] - }); - - return { - paymentValue2, - paymentValue3, - mod1Beneficiary, - mod2Beneficiary, - percent1, - percent2, - preferUnstaked, - reservedRate - }; - } - }, - { - description: "The owner should not have any tickets initially", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, expectedProjectId], - expect: 0 - }) - }, - { - description: - "Printing reserved before anything has been done shouldn't do anything", - fn: ({ contracts, executeFn, local: { expectedProjectId, owner } }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printReservedTickets", - args: [expectedProjectId] - }) - }, - { - description: "The owner should still not have any tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, expectedProjectId], - expect: 0 - }) - }, - { - description: "Make a payment to the project", - fn: async ({ - contracts, - executeFn, - randomBoolFn, - randomStringFn, - randomSignerFn, - local: { - expectedProjectId, - payer, - paymentValue2, - owner, - mod1Beneficiary, - mod2Beneficiary - } - }) => { - // An account that will be distributed tickets in the second payment. - // Simplify the test by disallowing the owner or either mod beneficiary. - const ticketBeneficiary1 = randomSignerFn({ - exclude: [ - owner.address, - mod1Beneficiary.address, - mod2Beneficiary.address - ] - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary1.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2 - }); - - return { ticketBeneficiary1 }; - } - }, - { - description: "The owner should now have printable reserved tickets", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, reservedRate, paymentValue2 } - }) => { - // The expected number of reserved tickets to expect from the first payment. - const expectedReservedTicketAmount2 = paymentValue2 - .mul(constants.InitialWeightMultiplier) - .mul(reservedRate) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: expectedReservedTicketAmount2, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }); - - return { expectedReservedTicketAmount2 }; - } - }, - { - description: "The owner should still not have any tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, owner } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, expectedProjectId], - expect: 0 - }) - }, - { - description: - "Issue the project's tickets so that the unstaked preference can be checked", - fn: ({ - contracts, - executeFn, - randomStringFn, - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedProjectId, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: "Print the reserved tickets", - fn: ({ - contracts, - executeFn, - local: { expectedProjectId, owner, reservedRate } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printReservedTickets", - args: [expectedProjectId], - expect: reservedRate.eq(0) && "TicketBooth::print: NO_OP" - }) - }, - { - description: - "The owner should now have the correct amount of tickets, accounting for any ticket mods", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - owner, - expectedReservedTicketAmount2, - percent1, - percent2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, expectedProjectId], - expect: expectedReservedTicketAmount2 - .mul(constants.MaxModPercent.sub(percent1).sub(percent2)) - .div(constants.MaxModPercent), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: - "The beneficiary of mod1 should now have the correct amount of tickets", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - expectedReservedTicketAmount2, - mod1Beneficiary, - percent1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [mod1Beneficiary.address, expectedProjectId], - expect: expectedReservedTicketAmount2 - .mul(percent1) - .div(constants.MaxModPercent), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: "Check for the correct number of staked tickets", - fn: ({ - constants, - contracts, - BigNumber, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - expectedReservedTicketAmount2, - mod1Beneficiary, - preferUnstaked, - percent1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [mod1Beneficiary.address, expectedProjectId], - expect: preferUnstaked - ? BigNumber.from(0) - : expectedReservedTicketAmount2 - .mul(percent1) - .div(constants.MaxModPercent), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: - "The beneficiary of mod2 should now have the correct amount of tickets", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - expectedReservedTicketAmount2, - mod2Beneficiary, - percent2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [mod2Beneficiary.address, expectedProjectId], - expect: expectedReservedTicketAmount2 - .mul(percent2) - .div(constants.MaxModPercent), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: "Check for the correct number of staked tickets", - fn: ({ - constants, - contracts, - BigNumber, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - expectedReservedTicketAmount2, - mod2Beneficiary, - preferUnstaked, - percent2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [mod2Beneficiary.address, expectedProjectId], - expect: preferUnstaked - ? BigNumber.from(0) - : expectedReservedTicketAmount2 - .mul(percent2) - .div(constants.MaxModPercent), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: "There should no longer be reserved tickets", - fn: ({ - contracts, - checkFn, - local: { expectedProjectId, owner, reservedRate } - }) => - checkFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: 0 - }) - }, - { - description: "Make another payment to the project", - fn: async ({ - contracts, - executeFn, - randomBoolFn, - randomStringFn, - randomSignerFn, - local: { - expectedProjectId, - payer, - paymentValue3, - owner, - mod1Beneficiary, - mod2Beneficiary, - ticketBeneficiary1 - } - }) => { - // An account that will be distributed tickets in the third payment. - // Simplify the test by disallowing the owner or either mod beneficiary. - const ticketBeneficiary2 = randomSignerFn({ - exclude: [ - owner.address, - mod1Beneficiary.address, - mod2Beneficiary.address, - ticketBeneficiary1.address - ] - }); - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary2.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue3 - }); - - return { ticketBeneficiary2 }; - } - }, - { - description: "The owner should now have printable reserved tickets again", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, reservedRate, paymentValue3 } - }) => { - // The expected number of reserved tickets to expect from the second payment. - const expectedReservedTicketAmount3 = paymentValue3 - .mul(constants.InitialWeightMultiplier) - .mul(reservedRate) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: expectedReservedTicketAmount3, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }); - return { expectedReservedTicketAmount3 }; - } - }, - { - description: "Redeem tickets from the beneficiary of the first payment", - fn: async ({ - contracts, - executeFn, - randomAddressFn, - randomBoolFn, - local: { expectedProjectId, ticketBeneficiary1, owner } - }) => { - const ticketAmount = await contracts.ticketBooth.balanceOf( - ticketBeneficiary1.address, - expectedProjectId - ); - const claimable = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary1.address, - expectedProjectId, - ticketAmount - ); - await executeFn({ - caller: ticketBeneficiary1, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary1.address, - expectedProjectId, - ticketAmount, - claimable, - randomAddressFn({ exclude: [owner.address] }), - randomBoolFn() - ], - revert: - (ticketAmount.eq(0) || claimable.eq(0)) && "TerminalV1::redeem: NO_OP" - }); - } - }, - { - description: - "The owner should still have the same number of printable reserved tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { expectedProjectId, reservedRate, expectedReservedTicketAmount3 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: expectedReservedTicketAmount3, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: "Redeem tickets from the beneficiary of the second payment", - fn: async ({ - contracts, - executeFn, - randomAddressFn, - randomBoolFn, - local: { expectedProjectId, ticketBeneficiary2 } - }) => { - const ticketAmount = await contracts.ticketBooth.balanceOf( - ticketBeneficiary2.address, - expectedProjectId - ); - const claimable = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary2.address, - expectedProjectId, - ticketAmount - ); - await executeFn({ - caller: ticketBeneficiary2, - contract: contracts.terminalV1, - fn: "redeem", - // Redeem all available tickets. - args: [ - ticketBeneficiary2.address, - expectedProjectId, - ticketAmount, - claimable, - randomAddressFn(), - randomBoolFn() - ], - revert: - (ticketAmount.eq(0) || claimable.eq(0)) && "TerminalV1::redeem: NO_OP" - }); - } - }, - { - description: - "The owner should still have the same number of printable reserved tickets", - fn: ({ - contracts, - checkFn, - local: { - expectedProjectId, - owner, - reservedRate, - expectedReservedTicketAmount3 - } - }) => - checkFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: expectedReservedTicketAmount3, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000 - } - }) - }, - { - description: "Print the reserved tickets", - fn: ({ contracts, executeFn, local: { expectedProjectId, owner } }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printReservedTickets", - args: [expectedProjectId] - }) - }, - { - description: "There should no longer be reserved tickets", - fn: ({ - contracts, - checkFn, - local: { expectedProjectId, owner, reservedRate } - }) => - checkFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "reservedTicketBalanceOf", - args: [expectedProjectId, reservedRate], - expect: 0 - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/projects.js b/packages/hardhat/test/integration/workflows/projects.js deleted file mode 100644 index 910067ac7c..0000000000 --- a/packages/hardhat/test/integration/workflows/projects.js +++ /dev/null @@ -1,617 +0,0 @@ -/** - Projects can be created independently from the TerminalV1 `deploy` mechanism. - Each project can set a URI that should be a IPFS CID, and a unique handle. - - Unique handles can be transfered between accounts. - - A created project can make use all TerminalV1 functionality as normal. -*/ -module.exports = [ - { - description: "Create a project", - fn: async ({ - deployer, - contracts, - executeFn, - randomStringFn, - randomSignerFn, - randomBytesFn, - incrementProjectIdFn - }) => { - // The address that will own a project. - const owner = randomSignerFn(); - - // Use the terminalV1 as the terminal. - const terminal = contracts.terminalV1.address; - - const expectedProjectId = incrementProjectIdFn(); - - // Make sure its unique by prepending the id. - const handle = randomBytesFn({ prepend: expectedProjectId.toString() }); - - const uri = randomStringFn(); - - await executeFn({ - caller: deployer, - contract: contracts.projects, - fn: "create", - args: [owner.address, handle, uri, terminal] - }); - - return { owner, terminal, handle, uri, expectedProjectId }; - } - }, - { - description: "Make sure the project's handle got saved", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId], - expect: handle - }) - }, - { - description: "Make sure the project was saved to the handle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { handle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: expectedProjectId - }) - }, - { - description: "Make sure the project's uri got saved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { uri, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "uriOf", - args: [expectedProjectId], - expect: uri - }) - }, - { - description: "Make sure the terminal was set in the directory", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { terminal, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: terminal - }) - }, - { - description: - "Make sure someone else can't deploy a project with the same handle", - fn: async ({ - contracts, - constants, - executeFn, - randomStringFn, - randomSignerFn, - local: { handle } - }) => { - // The address that will own another project. - const secondOwner = randomSignerFn(); - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - secondOwner.address, - handle, - randomStringFn(), - constants.AddressZero - ], - revert: "Projects::create: HANDLE_TAKEN" - }); - - return { secondOwner }; - } - }, - { - description: "Set a new URI", - fn: async ({ - contracts, - executeFn, - randomStringFn, - local: { owner, expectedProjectId } - }) => { - const secondUri = randomStringFn(); - await executeFn({ - caller: owner, - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, secondUri] - }); - - return { secondUri }; - } - }, - { - description: "Make sure the new uri got saved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { secondUri, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "uriOf", - args: [expectedProjectId], - expect: secondUri - }) - }, - { - description: "Set a new handle.", - fn: async ({ - contracts, - executeFn, - randomBytesFn, - local: { owner, handle, expectedProjectId } - }) => { - const secondHandle = randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString(), - exclude: [handle] - }); - await executeFn({ - caller: owner, - contract: contracts.projects, - fn: "setHandle", - args: [expectedProjectId, secondHandle] - }); - - return { secondHandle }; - } - }, - { - description: "Make sure the new handle got saved", - fn: ({ - contracts, - randomSignerFn, - checkFn, - local: { secondHandle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId], - expect: secondHandle - }) - }, - { - description: "Make sure the project was saved to the new handle", - fn: ({ - contracts, - randomSignerFn, - checkFn, - local: { secondHandle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [secondHandle], - expect: expectedProjectId - }) - }, - { - description: - "Make sure the old handle isn't affiliated with a project any longer", - fn: ({ contracts, randomSignerFn, checkFn, local: { handle } }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: 0 - }) - }, - { - description: - "Create another project for a different owner using the old handle", - fn: async ({ - contracts, - constants, - executeFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - local: { secondOwner, handle } - }) => { - const expectedSecondProjectId = incrementProjectIdFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - secondOwner.address, - handle, - randomStringFn(), - constants.AddressZero - ] - }); - return { expectedSecondProjectId }; - } - }, - { - description: - "Make sure the other owner can't set its project's handle to the one currently in use", - fn: ({ - contracts, - executeFn, - local: { secondOwner, secondHandle, expectedSecondProjectId } - }) => - executeFn({ - caller: secondOwner, - contract: contracts.projects, - fn: "setHandle", - args: [expectedSecondProjectId, secondHandle], - revert: "Projects::setHandle: HANDLE_TAKEN" - }) - }, - { - description: - "Don't allow a handle to be transfered if the replacement is taken", - fn: ({ - contracts, - executeFn, - local: { owner, secondOwner, handle, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "transferHandle", - args: [expectedProjectId, secondOwner.address, handle], - revert: "Projects::transferHandle: HANDLE_TAKEN" - }) - }, - { - description: "Transfer a handle and replace it with a new one", - fn: async ({ - contracts, - executeFn, - randomBytesFn, - local: { owner, secondOwner, expectedProjectId, handle, secondHandle } - }) => { - const thirdHandle = randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString(), - exclude: [handle, secondHandle] - }); - await executeFn({ - caller: owner, - contract: contracts.projects, - fn: "transferHandle", - args: [expectedProjectId, secondOwner.address, thirdHandle] - }); - return { thirdHandle }; - } - }, - { - description: "Make sure the replacement handle got saved", - fn: ({ - contracts, - randomSignerFn, - checkFn, - local: { thirdHandle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [expectedProjectId], - expect: thirdHandle - }) - }, - { - description: "Make sure the project was saved to the replacement handle", - fn: ({ - contracts, - randomSignerFn, - checkFn, - local: { thirdHandle, expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [thirdHandle], - expect: expectedProjectId - }) - }, - { - description: - "Make sure there is no project associated with the transfered handle", - fn: ({ contracts, randomSignerFn, checkFn, local: { secondHandle } }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [secondHandle], - expect: 0 - }) - }, - { - description: - "Make sure a project can't be created with the transfered handle", - fn: ({ - deployer, - contracts, - constants, - executeFn, - randomStringFn, - local: { secondOwner, secondHandle } - }) => - executeFn({ - caller: deployer, - contract: contracts.projects, - fn: "create", - args: [ - secondOwner.address, - secondHandle, - randomStringFn(), - constants.AddressZero - ], - revert: "Projects::create: HANDLE_TAKEN" - }) - }, - { - description: - "Make sure a project can't set its handle to the transfered handle", - fn: ({ - contracts, - executeFn, - local: { secondOwner, secondHandle, expectedSecondProjectId } - }) => - executeFn({ - caller: secondOwner, - contract: contracts.projects, - fn: "setHandle", - args: [expectedSecondProjectId, secondHandle], - revert: "Projects::setHandle: HANDLE_TAKEN" - }) - }, - { - description: - "Make sure no one else but the intended recipient can claim the transferd handle", - fn: ({ - contracts, - executeFn, - local: { owner, secondOwner, secondHandle, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "claimHandle", - args: [secondHandle, owner.address, expectedProjectId], - revert: - owner.address !== secondOwner.address && - "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: - "Make sure a transfered handle can be claimed if it hasn't been already", - fn: ({ - contracts, - executeFn, - local: { owner, secondOwner, secondHandle, expectedSecondProjectId } - }) => - executeFn({ - caller: secondOwner, - contract: contracts.projects, - fn: "claimHandle", - args: [secondHandle, secondOwner.address, expectedSecondProjectId], - revert: - owner.address === secondOwner.address && - "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: "Make sure the claimed handle got saved", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - owner, - secondOwner, - secondHandle, - expectedProjectId, - expectedSecondProjectId - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "handleOf", - args: [ - owner.address === secondOwner.address - ? expectedProjectId - : expectedSecondProjectId - ], - expect: secondHandle - }) - }, - { - description: "Make sure the project was saved to the claimed handle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - owner, - secondOwner, - secondHandle, - expectedProjectId, - expectedSecondProjectId - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [secondHandle], - expect: - owner.address === secondOwner.address - ? expectedProjectId - : expectedSecondProjectId - }) - }, - { - description: "Check to see if the first handle is still set correctly", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { owner, secondOwner, handle, expectedSecondProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "projectFor", - args: [handle], - expect: - owner.address === secondOwner.address ? expectedSecondProjectId : 0 - }) - }, - { - description: "Make a payment to the project", - fn: async ({ - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomStringFn, - getBalanceFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - - return { paymentValue }; - } - }, - { - description: "Configure the project's funding cycle", - fn: async ({ - contracts, - constants, - executeFn, - BigNumber, - randomBigNumberFn, - incrementFundingCycleIdFn, - local: { owner, paymentValue, expectedProjectId } - }) => { - // Burn the unused funding cycle ID. - incrementFundingCycleIdFn(); - - // The currency will be 0, which corresponds to ETH. - const currency = 0; - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - // Set a target amount thats at least the payment value so that the full payment value can be tapped. - target: randomBigNumberFn({ min: paymentValue }), - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ max: constants.MaxCycleLimit }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { currency }; - } - }, - { - description: - "Anyone can tap the full payment value on the project's behalf", - fn: ({ - contracts, - executeFn, - randomSignerFn, - local: { paymentValue, currency, expectedProjectId } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, paymentValue, currency, paymentValue] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/proxy_payment_addresses.js b/packages/hardhat/test/integration/workflows/proxy_payment_addresses.js deleted file mode 100644 index 054bba4de0..0000000000 --- a/packages/hardhat/test/integration/workflows/proxy_payment_addresses.js +++ /dev/null @@ -1,245 +0,0 @@ -/** - Projects can deploy addresses that will forward funds received to the project's funding cycle. -*/ - -const { BigNumber } = require("ethers"); - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn, - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - const owner = randomSignerFn(); - - // Make the test case cleaner with a reserved rate of 0. - const reservedRate = BigNumber.from(0); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString(), - }), - randomStringFn(), - { - target: BigNumber.from(1), - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxUint16, - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit, - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero, - }, - { - reservedRate, - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent, - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent, - }), - }, - [], - [], - ], - }); - return { owner, reservedRate, expectedProjectId }; - }, - }, - { - description: - "Make sure the terminalV1 got set as the project's current terminal", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { expectedProjectId }, - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: contracts.terminalV1.address, - }), - }, - { - description: "Deploy a proxy payment address", - fn: ({ - executeFn, - deployer, - contracts, - randomStringFn, - local: { expectedProjectId }, - }) => - executeFn({ - caller: deployer, - contract: contracts.proxyPaymentAddressManager, - fn: "deploy", - args: [expectedProjectId, randomStringFn()], - }), - }, - { - description: "Make a payment to the proxy payment address", - fn: async ({ - contracts, - BigNumber, - randomSignerFn, - local: { expectedProjectId }, - }) => { - const [proxyPaymentAddress] = - await contracts.proxyPaymentAddressManager.addressesOf( - expectedProjectId - ); - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Three payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = BigNumber.from(1); - - await payer.sendTransaction({ - to: proxyPaymentAddress, - value: paymentValue, - }); - - return { payer, paymentValue, proxyPaymentAddress }; - }, - }, - { - description: "There should now be a balance in the proxy payment address", - fn: ({ verifyBalanceFn, local: { paymentValue, proxyPaymentAddress } }) => - verifyBalanceFn({ - address: proxyPaymentAddress, - expect: paymentValue, - }), - }, - { - description: "Tap the proxy payment address", - fn: async ({ executeFn, local: { proxyPaymentAddress, payer } }) => { - await executeFn({ - caller: payer, - contractName: "ProxyPaymentAddress", - contractAddress: proxyPaymentAddress, - fn: "tap", - }); - }, - }, - { - description: "The balance should be empty in the proxy payment address", - fn: ({ verifyBalanceFn, local: { proxyPaymentAddress } }) => - verifyBalanceFn({ - address: proxyPaymentAddress, - expect: BigNumber.from(0), - }), - }, - { - description: - "Make sure the correct number of tickets were printed for the proxy payment address", - fn: ({ - checkFn, - contracts, - constants, - randomSignerFn, - local: { proxyPaymentAddress, expectedProjectId, paymentValue }, - }) => { - const expectedNumTickets = paymentValue.mul( - constants.InitialWeightMultiplier - ); - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [proxyPaymentAddress, expectedProjectId], - expect: expectedNumTickets, - }); - return { expectedNumTickets }; - }, - }, - { - description: "Transfer tickets from non-owner should fail.", - fn: async ({ - randomSignerFn, - executeFn, - local: { proxyPaymentAddress, expectedNumTickets }, - }) => { - const beneficiary = randomSignerFn(); - - await executeFn({ - caller: randomSignerFn(), - contractName: "ProxyPaymentAddress", - contractAddress: proxyPaymentAddress, - fn: "transferTickets", - args: [beneficiary.address, expectedNumTickets], - revert: "Ownable: caller is not the owner", - }); - - return { beneficiary }; - }, - }, - { - description: "Transfer tickets from the proxy payment address", - fn: async ({ - randomSignerFn, - deployer, - executeFn, - local: { proxyPaymentAddress, expectedNumTickets }, - }) => { - const beneficiary = randomSignerFn(); - - await executeFn({ - caller: deployer, - contractName: "ProxyPaymentAddress", - contractAddress: proxyPaymentAddress, - fn: "transferTickets", - args: [beneficiary.address, expectedNumTickets], - }); - - return { beneficiary }; - }, - }, - { - description: - "Make sure the correct number of tickets are transferred to the beneficiary", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { expectedNumTickets, expectedProjectId, beneficiary }, - }) => { - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [beneficiary.address, expectedProjectId], - expect: expectedNumTickets, - }); - }, - }, -]; diff --git a/packages/hardhat/test/integration/workflows/reconfigure.js b/packages/hardhat/test/integration/workflows/reconfigure.js deleted file mode 100644 index bc66513466..0000000000 --- a/packages/hardhat/test/integration/workflows/reconfigure.js +++ /dev/null @@ -1,919 +0,0 @@ -/** - A project can reconfigure its funding cycles. If no payments have been made, the current funding cycle should be configurable. - Otherwise, a new configuration should be made that should take effect in the subsequent funding cycle. - - These tests use an empty ballot, so reconfigurations may take effect right after the current funding cycle expires. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - incrementFundingCycleIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target1 = randomBigNumberFn({ min: amountToTap.mul(2) }); - - const duration1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - const cycleLimit1 = randomBigNumberFn({ - max: constants.MaxCycleLimit - }); - // Make sure its recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot1 = constants.AddressZero; - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reservedRate1, - bondingCurveRate1, - reconfigurationBondingCurveRate1, - amountToTap - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1 - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInitialWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedInitialTapped = BigNumber.from(0); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - return { - originalTimeMark: timeMark, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - }; - } - }, - { - description: "Make sure the funding cycle is the current one", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: - "The queued cycle should be a generated one with incremented properties", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - constants, - local: { - cycleLimit1, - target1, - ballot1, - duration1, - discountRate1, - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(1), - expectedFundingCycleId1, - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1.eq(0) ? BigNumber.from(0) : cycleLimit1.sub(1), - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot1, - timeMark.add(duration1.mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: - "Reconfiguring a project before a payment has been made should change the active funding cycle", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - local: { owner, expectedProjectId } - }) => { - const target2 = randomBigNumberFn(); - const currency2 = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - const cycleLimit2 = randomBigNumberFn({ - max: constants.MaxCycleLimit - }); - // Make sure its not recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reservedRate2, - bondingCurveRate2, - reconfigurationBondingCurveRate2 - }; - } - }, - { - description: "Make sure the first funding cycle got updated", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - originalTimeMark, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - expectedProjectId, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - cycleLimit2, - expectedInitialWeight, - ballot2, - // The start time should stay the same. - originalTimeMark, - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }); - - return { expectedPackedMetadata2 }; - } - }, - { - description: "Print some premined tickets", - fn: ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomStringFn, - randomAddressFn, - randomBoolFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - randomBigNumberFn({ - min: BigNumber.from(1), - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - max: BigNumber.from(10).pow(30) - }), - currency, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ] - }) - }, - { - description: - "Reconfiguring a project after initial tickets are printed, but before a payment has been made should change the active funding cycle", - fn: ({ - contracts, - executeFn, - local: { - owner, - target1, - duration1, - cycleLimit1, - discountRate1, - ballot1, - reservedRate1, - bondingCurveRate1, - reconfigurationBondingCurveRate1, - expectedProjectId - } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }) - }, - { - description: "Make sure the first funding cycle got updated", - fn: async ({ - contracts, - checkFn, - timeMark, - randomSignerFn, - BigNumber, - local: { - originalTimeMark, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - expectedProjectId, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - cycleLimit1, - expectedInitialWeight, - ballot1, - // The start time should stay the same. - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - BigNumber.from(expectedFee), - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - - return { configuredTimeMark: timeMark }; - } - }, - { - description: "Make a payment to the project", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - getBalanceFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - BigNumber, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - } - }, - { - description: "Reconfiguring should create a new funding cycle", - fn: async ({ - contracts, - executeFn, - incrementFundingCycleIdFn, - BigNumber, - local: { - owner, - target2, - currency2, - duration2, - cycleLimit2, - discountRate2, - ballot2, - reservedRate2, - bondingCurveRate2, - reconfigurationBondingCurveRate2, - expectedProjectId - } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - // The reconfigured funding cycle should be the second. - const expectedFundingCycleNumber2 = BigNumber.from(2); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { expectedFundingCycleId2, expectedFundingCycleNumber2 }; - } - }, - { - description: "The second funding cycle should have been configured", - fn: ({ - constants, - contracts, - checkFn, - timeMark, - randomSignerFn, - BigNumber, - local: { - discountRate1, - duration1, - originalTimeMark, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - expectedPackedMetadata2, - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber2, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId2], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber2, - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot2, - // The start time should be one duration after the initial start. - originalTimeMark.add(duration1.mul(86400)), - duration2, - target2, - BigNumber.from(currency2), - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }) - }, - { - description: "The first funding cycle should not have been configured", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - local: { - originalTimeMark, - configuredTimeMark, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - configuredTimeMark, - cycleLimit1, - expectedInitialWeight, - ballot1, - // The start time should stay the same. - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "The second funding cycle should be queued", - fn: ({ - constants, - contracts, - checkFn, - timeMark, - randomSignerFn, - local: { - originalTimeMark, - discountRate1, - duration1, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - expectedPackedMetadata2, - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber2, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber2, - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot2, - // The start time should be one duration after the initial start. - originalTimeMark.add(duration1.mul(86400)), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }) - }, - { - description: "The first funding cycle should still be the current", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - local: { - originalTimeMark, - configuredTimeMark, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - configuredTimeMark, - cycleLimit1, - expectedInitialWeight, - ballot1, - // The start time should stay the same. - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "Tap some of the current funding cycle", - fn: ({ - randomSignerFn, - contracts, - executeFn, - local: { expectedProjectId, amountToTap } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }) - }, - { - description: "The current should now have a tapped amount", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - local: { - originalTimeMark, - configuredTimeMark, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - expectedInitialWeight, - expectedFee, - amountToTap - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - configuredTimeMark, - cycleLimit1, - expectedInitialWeight, - ballot1, - // The start time should stay the same. - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - amountToTap, - expectedPackedMetadata1 - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/redeem.js b/packages/hardhat/test/integration/workflows/redeem.js deleted file mode 100644 index b40c4b6a16..0000000000 --- a/packages/hardhat/test/integration/workflows/redeem.js +++ /dev/null @@ -1,1288 +0,0 @@ -/** - Ticket holders of a project should be able to redeem their tickets for a portion of the - project's overflow proportional to a bonding curve formula. - - The bonding curve rate that tunes the bonding curve formula gets configured by the project. - - If a project has an active reconfiguration ballot, the reconfiguration bonding curve should be used, - instead of the regular bonding curve. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project for the owner", - fn: async ({ - executeFn, - randomSignerFn, - deployer, - BigNumber, - randomBytesFn, - randomStringFn, - getBalanceFn, - randomBigNumberFn, - constants, - contracts, - incrementProjectIdFn, - incrementFundingCycleIdFn, - deployContractFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project that will migrate. - const owner = randomSignerFn(); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Three payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(10), - max: (await getBalanceFn(payer.address)).div(100) - }); - - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(10), - max: (await getBalanceFn(payer.address)).div(100) - }); - - const paymentValue3 = randomBigNumberFn({ - min: BigNumber.from(10), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The project's funding cycle target will at most be the sum of all payments. - const target = randomBigNumberFn({ - max: paymentValue1.add(paymentValue2).add(paymentValue3) - }); - - // Set a random percentage of tickets to reserve for the project owner. - const reservedRate = randomBigNumberFn({ max: constants.MaxPercent }); - - // Set a random discount rate. Don't allow non-recurring cycles. - const discountRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - - // Set a random bonding curve rate. - const bondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - - // Set a random reconfiguration bonding curve rate. - const reconfigurationBondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - - // Use a ballot that has a fixed approval time. - const ballot = await deployContractFn("Active14DaysFundingCycleBallot"); - - // The duration of the ballot, after which it is approved. - const ballotDurationInDays = (await ballot.duration()).div(86400); - - // The duration of the funding cycle should be at least one day longer than the ballot. - const minDuration = randomBigNumberFn({ - min: ballotDurationInDays.add(1), - max: constants.MaxUint16 - }); - - await executeFn({ - caller: deployer, - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target, - currency, - duration: randomBigNumberFn({ - min: minDuration, - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ max: constants.MaxCycleLimit }), - discountRate, - ballot: ballot.address - }, - { - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - }, - [], - [] - ] - }); - - return { - expectedProjectId, - owner, - target, - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate, - payer, - paymentValue1, - paymentValue2, - paymentValue3, - initialContractBalance: await getBalanceFn(contracts.terminalV1.address), - ballot - }; - } - }, - { - description: "Make a payment to the project", - fn: async ({ - executeFn, - randomBoolFn, - randomStringFn, - randomSignerFn, - contracts, - local: { expectedProjectId, payer, paymentValue1, owner } - }) => { - // An account that will be distributed tickets in the first payment. - const ticketBeneficiary1 = randomSignerFn({ - exclude: [owner.address] - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary1.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }); - - return { payer, ticketBeneficiary1, paymentValue1 }; - } - }, - { - description: "Can't redeem with no overflow", - fn: async ({ - executeFn, - randomBoolFn, - randomAddressFn, - contracts, - BigNumber, - constants, - local: { - expectedProjectId, - ticketBeneficiary1, - reservedRate, - paymentValue1 - } - }) => { - const expectedTotalTicketsFromPayment1 = paymentValue1.mul( - constants.InitialWeightMultiplier - ); - - const expectedRedeemableTicketsOfTicketBeneficiary1 = expectedTotalTicketsFromPayment1 - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await executeFn({ - caller: ticketBeneficiary1, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary1.address, - expectedProjectId, - BigNumber.from(1), - 0, - randomAddressFn(), - randomBoolFn() - ], - revert: expectedRedeemableTicketsOfTicketBeneficiary1.eq(0) - ? "TerminalV1::claimableOverflow: INSUFFICIENT_TICKETS" - : "TerminalV1::redeem: NO_OP" - }); - - return { - expectedTotalTicketsFromPayment1, - expectedRedeemableTicketsOfTicketBeneficiary1 - }; - } - }, - { - description: - "Make another payment to the project, sending tickets to a different beneficiary", - fn: async ({ - randomSignerFn, - executeFn, - contracts, - randomStringFn, - randomBoolFn, - local: { - payer, - expectedProjectId, - paymentValue2, - owner, - ticketBeneficiary1 - } - }) => { - // An account that will be distributed tickets in the second payment. - const ticketBeneficiary2 = randomSignerFn({ - exclude: [owner.address, ticketBeneficiary1.address] - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary2.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2 - }); - return { ticketBeneficiary2 }; - } - }, - { - description: - "Make a third payment to the project, sending tickets to a different beneficiary", - fn: async ({ - executeFn, - randomBoolFn, - randomStringFn, - randomSignerFn, - contracts, - local: { - payer, - expectedProjectId, - paymentValue3, - owner, - ticketBeneficiary1, - ticketBeneficiary2 - } - }) => { - // An account that will be distributed tickets in the third payment. - const ticketBeneficiary3 = randomSignerFn({ - exclude: [ - owner.address, - ticketBeneficiary1.address, - ticketBeneficiary2.address - ] - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary3.address, - randomStringFn(), - randomBoolFn() - ], - value: paymentValue3 - }); - - return { ticketBeneficiary3 }; - } - }, - { - description: "The project's balance should match the payments just made", - fn: ({ - checkFn, - contracts, - randomAddressFn, - local: { expectedProjectId, paymentValue1, paymentValue2, paymentValue3 } - }) => - checkFn({ - caller: randomAddressFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [expectedProjectId], - expect: paymentValue1.add(paymentValue2).add(paymentValue3) - }) - }, - { - description: "The terminalV1 should have the funds from the payments", - fn: ({ - contracts, - verifyBalanceFn, - local: { - paymentValue1, - paymentValue2, - paymentValue3, - initialContractBalance - } - }) => - verifyBalanceFn({ - address: contracts.terminalV1.address, - expect: initialContractBalance.add( - paymentValue1.add(paymentValue2).add(paymentValue3) - ) - }) - }, - { - description: - "The first ticket beneficiary received the expected amount of tickets", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary1, - expectedRedeemableTicketsOfTicketBeneficiary1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary1.address, expectedProjectId], - expect: expectedRedeemableTicketsOfTicketBeneficiary1 - }) - }, - { - description: - "The first ticket beneficiary has the expected amount of claimable funds", - fn: async ({ - contracts, - bondingCurveFn, - checkFn, - randomSignerFn, - constants, - local: { - expectedProjectId, - ticketBeneficiary1, - paymentValue1, - paymentValue2, - paymentValue3, - target, - bondingCurveRate, - expectedTotalTicketsFromPayment1, - expectedRedeemableTicketsOfTicketBeneficiary1 - } - }) => { - const expectedTotalTicketsFromPayment2 = paymentValue2.mul( - constants.InitialWeightMultiplier - ); - - const expectedTotalTicketsFromPayment3 = paymentValue3.mul( - constants.InitialWeightMultiplier - ); - - const expectedTotalTickets = expectedTotalTicketsFromPayment1 - .add(expectedTotalTicketsFromPayment2) - .add(expectedTotalTicketsFromPayment3); - - // Get the stored ticket amount. - const redeemableTicketsOfTicketBeneficiary1 = await contracts.ticketBooth.balanceOf( - ticketBeneficiary1.address, - expectedProjectId - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "claimableOverflowOf", - args: [ - ticketBeneficiary1.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary1 - ], - expect: bondingCurveFn({ - rate: bondingCurveRate, - count: expectedRedeemableTicketsOfTicketBeneficiary1, - total: expectedTotalTickets, - overflow: paymentValue1 - .add(paymentValue2) - .add(paymentValue3) - .sub(target) - }), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }); - - return { - redeemableTicketsOfTicketBeneficiary1, - expectedTotalTicketsFromPayment2, - expectedTotalTicketsFromPayment3, - expectedTotalTickets - }; - } - }, - { - description: - "The first ticket beneficiary tickets can be redeemed successfully", - fn: async ({ - randomBoolFn, - contracts, - executeFn, - getBalanceFn, - randomAddressFn, - BigNumber, - local: { - redeemableTicketsOfTicketBeneficiary1, - expectedProjectId, - ticketBeneficiary1 - } - }) => { - // An address that will be the beneficiary of funds when redeeming the first set of tickets. - const redeemBeneficiary1 = randomAddressFn({ - // Can't be the ticket beneficiary because this account will spend on gas before the desired calculation is made. - exclude: [ticketBeneficiary1.address] - }); - - const initialBalanceOfRedeemBeneficiary1 = await getBalanceFn( - redeemBeneficiary1 - ); - - // Get the stored claimable amount. - const redeemableAmountOfTicketBeneficiary1 = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary1.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary1 - ); - - const expectNoOp = redeemableAmountOfTicketBeneficiary1.eq(0); - - await executeFn({ - caller: ticketBeneficiary1, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary1.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary1, - redeemBeneficiary1, - randomBoolFn() - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - // If the requested reverted with no op, the tickets wont be redeemed. - const leftoverTicketsOfTicketBeneficiary1 = expectNoOp - ? redeemableTicketsOfTicketBeneficiary1 - : BigNumber.from(0); - - return { - redeemBeneficiary1, - redeemableAmountOfTicketBeneficiary1, - initialBalanceOfRedeemBeneficiary1, - leftoverTicketsOfTicketBeneficiary1 - }; - } - }, - { - description: - "The first redeem beneficiary received the correct amount of funds", - fn: ({ - verifyBalanceFn, - local: { - redeemableAmountOfTicketBeneficiary1, - redeemBeneficiary1, - initialBalanceOfRedeemBeneficiary1 - } - }) => - verifyBalanceFn({ - address: redeemBeneficiary1, - expect: initialBalanceOfRedeemBeneficiary1.add( - redeemableAmountOfTicketBeneficiary1 - ) - }) - }, - { - description: "The first ticket beneficiary has no tickets left", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary1, - leftoverTicketsOfTicketBeneficiary1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary1.address, expectedProjectId], - expect: leftoverTicketsOfTicketBeneficiary1 - }) - }, - { - description: - "The terminalV1 should no longer have the funds sent to the first redeem beneificiary", - fn: ({ - contracts, - verifyBalanceFn, - local: { - paymentValue1, - paymentValue2, - paymentValue3, - initialContractBalance, - redeemableAmountOfTicketBeneficiary1 - } - }) => - verifyBalanceFn({ - address: contracts.terminalV1.address, - expect: initialContractBalance - .add(paymentValue1.add(paymentValue2).add(paymentValue3)) - .sub(redeemableAmountOfTicketBeneficiary1) - }) - }, - { - description: - "The second ticket beneficiary received the expected amount of tickets", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - constants, - local: { - reservedRate, - expectedProjectId, - ticketBeneficiary2, - expectedTotalTicketsFromPayment2 - } - }) => { - const expectedRedeemableTicketsOfTicketBeneficiary2 = expectedTotalTicketsFromPayment2 - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary2.address, expectedProjectId], - expect: expectedRedeemableTicketsOfTicketBeneficiary2 - }); - - return { expectedRedeemableTicketsOfTicketBeneficiary2 }; - } - }, - { - description: - "A reconfiguration should activate the reconfiguration bonding curve", - fn: async ({ - executeFn, - randomBigNumberFn, - contracts, - constants, - BigNumber, - incrementFundingCycleIdFn, - local: { owner, expectedProjectId } - }) => { - // Burn the unused funding cycle ID ID. - incrementFundingCycleIdFn(); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - } - }, - { - description: - "The second ticket beneficiary has the expected amount of claimable funds using the reconfiguration bonding curve rate", - fn: async ({ - contracts, - bondingCurveFn, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary2, - paymentValue1, - paymentValue2, - paymentValue3, - target, - reconfigurationBondingCurveRate, - redeemableTicketsOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary1, - leftoverTicketsOfTicketBeneficiary1, - expectedTotalTickets - } - }) => { - // Get the stored ticket amount. - const redeemableTicketsOfTicketBeneficiary2 = await contracts.ticketBooth.balanceOf( - ticketBeneficiary2.address, - expectedProjectId - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "claimableOverflowOf", - args: [ - ticketBeneficiary2.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary2 - ], - expect: bondingCurveFn({ - rate: reconfigurationBondingCurveRate, - count: redeemableTicketsOfTicketBeneficiary2, - total: expectedTotalTickets - .sub(redeemableTicketsOfTicketBeneficiary1) - .add(leftoverTicketsOfTicketBeneficiary1), - overflow: paymentValue1 - .add(paymentValue2) - .add(paymentValue3) - .sub(target) - .sub(redeemableAmountOfTicketBeneficiary1) - }), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }); - - return { - redeemableTicketsOfTicketBeneficiary2 - }; - } - }, - { - description: - "The second ticket beneficiary tickets can be redeemed successfully", - fn: async ({ - randomBoolFn, - contracts, - executeFn, - getBalanceFn, - randomAddressFn, - BigNumber, - local: { - redeemableTicketsOfTicketBeneficiary2, - expectedProjectId, - ticketBeneficiary2 - } - }) => { - // An address that will be the beneficiary of funds when redeeming the first set of tickets. - const redeemBeneficiary2 = randomAddressFn({ - // Can't be the ticket beneficiary because this account will spend on gas before the desired calculation is made. - exclude: [ticketBeneficiary2.address] - }); - - const initialBalanceOfRedeemBeneficiary2 = await getBalanceFn( - redeemBeneficiary2 - ); - - // Get the stored claimable amount. - const redeemableAmountOfTicketBeneficiary2 = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary2.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary2 - ); - - const expectNoOp = redeemableAmountOfTicketBeneficiary2.eq(0); - - await executeFn({ - caller: ticketBeneficiary2, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary2.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary2, - redeemableAmountOfTicketBeneficiary2, - redeemBeneficiary2, - randomBoolFn() - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - // If the requested reverted with no op, the tickets wont be redeemed. - const leftoverTicketsOfTicketBeneficiary2 = expectNoOp - ? redeemableTicketsOfTicketBeneficiary2 - : BigNumber.from(0); - - return { - redeemBeneficiary2, - redeemableAmountOfTicketBeneficiary2, - initialBalanceOfRedeemBeneficiary2, - leftoverTicketsOfTicketBeneficiary2 - }; - } - }, - { - description: - "The second redeem beneficiary received the correct amount of funds", - fn: ({ - verifyBalanceFn, - local: { - redeemableAmountOfTicketBeneficiary2, - redeemBeneficiary2, - initialBalanceOfRedeemBeneficiary2 - } - }) => - verifyBalanceFn({ - address: redeemBeneficiary2, - expect: initialBalanceOfRedeemBeneficiary2.add( - redeemableAmountOfTicketBeneficiary2 - ) - }) - }, - { - description: "The second ticket beneficiary has no tickets left", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary2, - leftoverTicketsOfTicketBeneficiary2 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary2.address, expectedProjectId], - expect: leftoverTicketsOfTicketBeneficiary2 - }) - }, - { - description: - "The terminalV1 should no longer have the funds sent to the second redeem beneificiary", - fn: ({ - contracts, - verifyBalanceFn, - local: { - paymentValue1, - paymentValue2, - paymentValue3, - initialContractBalance, - redeemableAmountOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary2 - } - }) => - verifyBalanceFn({ - address: contracts.terminalV1.address, - expect: initialContractBalance - .add(paymentValue1.add(paymentValue2).add(paymentValue3)) - .sub(redeemableAmountOfTicketBeneficiary1) - .sub(redeemableAmountOfTicketBeneficiary2) - }) - }, - { - description: - "The third ticket beneficiary received the expected amount of tickets", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - constants, - local: { - reservedRate, - expectedProjectId, - ticketBeneficiary3, - expectedTotalTicketsFromPayment3 - } - }) => { - const expectedRedeemableTicketsOfTicketBeneficiary3 = expectedTotalTicketsFromPayment3 - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary3.address, expectedProjectId], - expect: expectedRedeemableTicketsOfTicketBeneficiary3 - }); - - return { expectedRedeemableTicketsOfTicketBeneficiary3 }; - } - }, - { - description: "Fast forward past to the ballot duration", - fn: async ({ fastforwardFn, local: { ballot } }) => - fastforwardFn((await ballot.duration()).add(1)) - }, - { - description: - "The third ticket beneficiary has the expected amount of claimable funds", - fn: async ({ - contracts, - bondingCurveFn, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary3, - paymentValue1, - paymentValue2, - paymentValue3, - target, - bondingCurveRate, - redeemableTicketsOfTicketBeneficiary1, - redeemableTicketsOfTicketBeneficiary2, - redeemableAmountOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary2, - leftoverTicketsOfTicketBeneficiary1, - leftoverTicketsOfTicketBeneficiary2, - expectedTotalTickets - } - }) => { - // Get the stored ticket amount. - const redeemableTicketsOfTicketBeneficiary3 = await contracts.ticketBooth.balanceOf( - ticketBeneficiary3.address, - expectedProjectId - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "claimableOverflowOf", - args: [ - ticketBeneficiary3.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary3 - ], - expect: bondingCurveFn({ - rate: bondingCurveRate, - count: redeemableTicketsOfTicketBeneficiary3, - total: expectedTotalTickets - .sub(redeemableTicketsOfTicketBeneficiary1) - .add(leftoverTicketsOfTicketBeneficiary1) - .sub(redeemableTicketsOfTicketBeneficiary2) - .add(leftoverTicketsOfTicketBeneficiary2), - overflow: paymentValue1 - .add(paymentValue2) - .add(paymentValue3) - .sub(target) - .sub(redeemableAmountOfTicketBeneficiary1) - .sub(redeemableAmountOfTicketBeneficiary2) - }), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }); - - return { - redeemableTicketsOfTicketBeneficiary3 - }; - } - }, - { - description: - "The third ticket beneficiary tickets can be redeemed successfully", - fn: async ({ - randomBoolFn, - contracts, - executeFn, - getBalanceFn, - randomAddressFn, - BigNumber, - local: { - redeemableTicketsOfTicketBeneficiary3, - expectedProjectId, - ticketBeneficiary3 - } - }) => { - // An address that will be the beneficiary of funds when redeeming the first set of tickets. - const redeemBeneficiary3 = randomAddressFn({ - // Can't be the ticket beneficiary because this account will spend on gas before the desired calculation is made. - exclude: [ticketBeneficiary3.address] - }); - - const initialBalanceOfRedeemBeneficiary3 = await getBalanceFn( - redeemBeneficiary3 - ); - - // Get the stored claimable amount. - const redeemableAmountOfTicketBeneficiary3 = await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary3.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary3 - ); - - const expectNoOp = redeemableAmountOfTicketBeneficiary3.eq(0); - - await executeFn({ - caller: ticketBeneficiary3, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary3.address, - expectedProjectId, - redeemableTicketsOfTicketBeneficiary3, - redeemableAmountOfTicketBeneficiary3, - redeemBeneficiary3, - randomBoolFn() - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - // If the requested reverted with no op, the tickets wont be redeemed. - const leftoverTicketsOfTicketBeneficiary3 = expectNoOp - ? redeemableTicketsOfTicketBeneficiary3 - : BigNumber.from(0); - - return { - redeemBeneficiary3, - redeemableAmountOfTicketBeneficiary3, - initialBalanceOfRedeemBeneficiary3, - leftoverTicketsOfTicketBeneficiary3 - }; - } - }, - { - description: - "The third redeem beneficiary received the correct amount of funds", - fn: ({ - verifyBalanceFn, - local: { - redeemableAmountOfTicketBeneficiary3, - redeemBeneficiary3, - initialBalanceOfRedeemBeneficiary3 - } - }) => - verifyBalanceFn({ - address: redeemBeneficiary3, - expect: initialBalanceOfRedeemBeneficiary3.add( - redeemableAmountOfTicketBeneficiary3 - ) - }) - }, - { - description: "The first ticket beneficiary has no tickets left", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary3, - leftoverTicketsOfTicketBeneficiary3 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary3.address, expectedProjectId], - expect: leftoverTicketsOfTicketBeneficiary3 - }) - }, - { - description: - "The terminalV1 should no longer have the funds sent to the second redeem beneificiary", - fn: ({ - contracts, - verifyBalanceFn, - local: { - paymentValue1, - paymentValue2, - paymentValue3, - initialContractBalance, - redeemableAmountOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary2, - redeemableAmountOfTicketBeneficiary3 - } - }) => - verifyBalanceFn({ - address: contracts.terminalV1.address, - expect: initialContractBalance - .add(paymentValue1.add(paymentValue2).add(paymentValue3)) - .sub(redeemableAmountOfTicketBeneficiary1) - .sub(redeemableAmountOfTicketBeneficiary2) - .sub(redeemableAmountOfTicketBeneficiary3) - }) - }, - { - description: "Print the reserved tickets for the owner of the project", - fn: ({ - executeFn, - randomSignerFn, - contracts, - local: { expectedProjectId } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "printReservedTickets", - args: [expectedProjectId] - }) - }, - { - description: "The owner has the correct ticket balance", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedTotalTickets, - expectedRedeemableTicketsOfTicketBeneficiary1, - expectedRedeemableTicketsOfTicketBeneficiary2, - expectedRedeemableTicketsOfTicketBeneficiary3, - expectedProjectId, - owner - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, expectedProjectId], - expect: expectedTotalTickets - .sub(expectedRedeemableTicketsOfTicketBeneficiary1) - .sub(expectedRedeemableTicketsOfTicketBeneficiary2) - .sub(expectedRedeemableTicketsOfTicketBeneficiary3), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100000 - } - }) - }, - { - description: "The owners' balance is the expected total ticket balance", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedTotalTickets, - redeemableTicketsOfTicketBeneficiary1, - redeemableTicketsOfTicketBeneficiary2, - redeemableTicketsOfTicketBeneficiary3, - leftoverTicketsOfTicketBeneficiary1, - leftoverTicketsOfTicketBeneficiary2, - leftoverTicketsOfTicketBeneficiary3, - expectedProjectId - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "totalSupplyOf", - args: [expectedProjectId], - expect: expectedTotalTickets - .sub(redeemableTicketsOfTicketBeneficiary1) - .add(leftoverTicketsOfTicketBeneficiary1) - .sub(redeemableTicketsOfTicketBeneficiary2) - .add(leftoverTicketsOfTicketBeneficiary2) - .sub(redeemableTicketsOfTicketBeneficiary3) - .add(leftoverTicketsOfTicketBeneficiary3), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100000 - } - }) - }, - { - description: "The remaining overflow should be correct", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - paymentValue1, - paymentValue2, - paymentValue3, - redeemableAmountOfTicketBeneficiary1, - redeemableAmountOfTicketBeneficiary2, - redeemableAmountOfTicketBeneficiary3, - target, - expectedProjectId - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "currentOverflowOf", - args: [expectedProjectId], - expect: paymentValue1 - .add(paymentValue2) - .add(paymentValue3) - .sub(target) - .sub(redeemableAmountOfTicketBeneficiary1) - .sub(redeemableAmountOfTicketBeneficiary2) - .sub(redeemableAmountOfTicketBeneficiary3), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: - "The expected redeem amount for the owner's portion should match the claimable overflow for all its tickets", - // "The expected redeem amount for the owner's portion should match the remainder of overflow", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - bondingCurveFn, - local: { expectedProjectId, owner, bondingCurveRate } - }) => { - const reservedTicketBalance = await contracts.ticketBooth.balanceOf( - owner.address, - expectedProjectId - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "claimableOverflowOf", - args: [owner.address, expectedProjectId, reservedTicketBalance], - expect: bondingCurveFn({ - rate: bondingCurveRate, - count: reservedTicketBalance, - total: await contracts.ticketBooth.totalSupplyOf(expectedProjectId), - overflow: await contracts.terminalV1.currentOverflowOf(expectedProjectId) - }), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }); - - return { reservedTicketBalance }; - } - }, - { - description: "The owner can redeem successfully", - fn: async ({ - executeFn, - contracts, - randomBoolFn, - getBalanceFn, - randomAddressFn, - BigNumber, - local: { expectedProjectId, owner, reservedTicketBalance } - }) => { - // An address that will be the beneficiary of funds when redeeming the reserved set of tickets. - const redeemBeneficiary4 = randomAddressFn({ - // Can't be the ticket beneficiary because this account will spend on gas before the desired calculation is made. - exclude: [owner.address] - }); - - const initialBalanceOfRedeemBeneficiary4 = await getBalanceFn( - redeemBeneficiary4 - ); - - const claimableOverflow = await contracts.terminalV1.claimableOverflowOf( - owner.address, - expectedProjectId, - reservedTicketBalance - ); - - const expectNoOp = reservedTicketBalance.eq(0) || claimableOverflow.eq(0); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - owner.address, - expectedProjectId, - reservedTicketBalance, - claimableOverflow, - redeemBeneficiary4, - randomBoolFn() - ], - revert: expectNoOp && "TerminalV1::redeem: NO_OP" - }); - - // If the requested reverted with no op, the tickets wont be redeemed. - const leftoverReservedTickets = expectNoOp - ? reservedTicketBalance - : BigNumber.from(0); - return { - redeemBeneficiary4, - initialBalanceOfRedeemBeneficiary4, - claimableOverflow, - leftoverReservedTickets - }; - } - }, - { - description: "The beneficiary received the correct amount of funds", - fn: ({ - verifyBalanceFn, - local: { - redeemBeneficiary4, - claimableOverflow, - initialBalanceOfRedeemBeneficiary4 - } - }) => - verifyBalanceFn({ - address: redeemBeneficiary4, - expect: initialBalanceOfRedeemBeneficiary4.add(claimableOverflow) - }) - }, - { - description: "There should only be the expected leftover tickets left", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - leftoverTicketsOfTicketBeneficiary1, - leftoverTicketsOfTicketBeneficiary2, - leftoverTicketsOfTicketBeneficiary3, - leftoverReservedTickets - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "totalSupplyOf", - args: [expectedProjectId], - expect: leftoverTicketsOfTicketBeneficiary1 - .add(leftoverTicketsOfTicketBeneficiary2) - .add(leftoverTicketsOfTicketBeneficiary3) - .add(leftoverReservedTickets) - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/set_fee.js b/packages/hardhat/test/integration/workflows/set_fee.js deleted file mode 100644 index 670f91ad9e..0000000000 --- a/packages/hardhat/test/integration/workflows/set_fee.js +++ /dev/null @@ -1,550 +0,0 @@ -/** - Governance can set a new fee for future configurations in the TerminalV1. - - All current configurations will not be affected, and will keep the old fee until a new configuration is approved. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target = randomBigNumberFn({ min: amountToTap.mul(2) }); - - const duration = randomBigNumberFn({ - min: BigNumber.from(1), - max: BigNumber.from(10000) - }); - const cycleLimit = randomBigNumberFn({ - max: constants.MaxCycleLimit - }); - - // Make recurring. - const discountRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot = constants.AddressZero; - - // Set the reserved rate to 0 to make test cases cleaner. - const reservedRate = BigNumber.from(0); - - const bondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate = randomBigNumberFn({ - max: constants.MaxPercent - }); - - // Expect the funding cycle's weight to be the base weight. - const expectedInitialWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target, - currency, - duration, - cycleLimit, - discountRate, - ballot - }, - { - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - }, - [], - [] - ] - }); - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - reconfigurationBondingCurveRate, - bondingCurveRate, - reservedRate, - cycleLimit, - ballot, - duration, - target, - currency, - discountRate, - amountToTap, - expectedInitialWeight, - expectedFee - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - reconfigurationBondingCurveRate, - bondingCurveRate, - reservedRate, - cycleLimit, - ballot, - duration, - target, - discountRate, - expectedInitialWeight, - expectedFee - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata = BigNumber.from(0); - expectedPackedMetadata = expectedPackedMetadata.add( - reconfigurationBondingCurveRate - ); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - expectedPackedMetadata = expectedPackedMetadata.add(bondingCurveRate); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - expectedPackedMetadata = expectedPackedMetadata.add(reservedRate); - expectedPackedMetadata = expectedPackedMetadata.shl(8); - - // Expect the funding cycle to be based on the 0th funding cycle. - const expectedBasedOn = BigNumber.from(0); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedInitialTapped = BigNumber.from(0); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - expectedBasedOn, - timeMark, - cycleLimit, - expectedInitialWeight, - ballot, - timeMark, - duration, - target, - BigNumber.from(currency), - expectedFee, - discountRate, - expectedInitialTapped, - expectedPackedMetadata - ] - }); - return { - originalTimeMark: timeMark, - expectedPackedMetadata, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - }; - } - }, - { - description: "Set a new fee", - fn: async ({ - randomBigNumberFn, - constants, - executeFn, - deployer, - contracts - }) => { - const newFee = randomBigNumberFn({ max: constants.MaxPercent }); - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "setFee", - args: [contracts.terminalV1.address, newFee] - }); - return { newFee }; - } - }, - { - description: - "Fast forward to the next funding cycle that uses the same configuration", - fn: ({ - randomBigNumberFn, - fastforwardFn, - BigNumber, - local: { duration } - }) => - fastforwardFn( - // An arbitrary day after the duration is within the next cycle. - duration.mul(86400).add( - randomBigNumberFn({ - min: BigNumber.from(5), - max: BigNumber.from(86390) - }) - ) - ) - }, - { - description: "The funding cycle should still have the original fee", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - cycleLimit, - ballot, - discountRate, - duration, - target, - expectedPackedMetadata, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit.eq(0) ? BigNumber.from(0) : cycleLimit.sub(1), - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate)) - .div(constants.DiscountRatePercentDenominator), - ballot, - originalTimeMark.add(duration.mul(86400)), - duration, - target, - BigNumber.from(currency), - expectedFee, - discountRate, - expectedInitialTapped, - expectedPackedMetadata - ] - }) - }, - { - description: "Make a payment to lock in the first configuration", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - getBalanceFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - BigNumber, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - // The min should be some decently meaningful number. - // Otherwise its possible that the weight amount of the payment is 0, which means no tickets will be printed, - // which means the configuration in this test will configure the active cycle and not expect it. - min: BigNumber.from(100), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - - return { paymentValue }; - } - }, - { - description: - "Reconfiguring a project after a new fee has been set should affect future funding cycles", - fn: async ({ - contracts, - executeFn, - incrementFundingCycleIdFn, - local: { - expectedProjectId, - owner, - target, - duration, - cycleLimit, - discountRate, - ballot, - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target, - currency, - duration, - cycleLimit, - discountRate, - ballot - }, - { - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate - }, - [], - [] - ] - }); - return { expectedFundingCycleId2 }; - } - }, - { - description: "The queued funding cycle should use the new fee", - fn: async ({ - constants, - contracts, - checkFn, - timeMark, - randomSignerFn, - BigNumber, - local: { - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - newFee, - target, - cycleLimit, - ballot, - discountRate, - duration, - expectedPackedMetadata, - expectedFundingCycleId2, - expectedProjectId, - expectedInitialWeight, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(2), - expectedFundingCycleId1, - timeMark, - cycleLimit, - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate)) - .mul(constants.DiscountRatePercentDenominator.sub(discountRate)) - .div(constants.DiscountRatePercentDenominator) - .div(constants.DiscountRatePercentDenominator), - ballot, - originalTimeMark.add(duration.mul(86400).mul(2)), - duration, - target, - BigNumber.from(currency), - newFee, - discountRate, - expectedInitialTapped, - expectedPackedMetadata - ] - }) - }, - { - description: "The current shouldn't be affected", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - cycleLimit, - ballot, - discountRate, - duration, - target, - expectedPackedMetadata, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit.eq(0) ? BigNumber.from(0) : cycleLimit.sub(1), - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate)) - .div(constants.DiscountRatePercentDenominator), - ballot, - originalTimeMark.add(duration.mul(86400)), - duration, - target, - BigNumber.from(currency), - expectedFee, - discountRate, - expectedInitialTapped, - expectedPackedMetadata - ] - }) - }, - { - description: "Tap some of the current funding cycle", - fn: async ({ - randomSignerFn, - contracts, - executeFn, - incrementFundingCycleIdFn, - local: { expectedProjectId, amountToTap } - }) => { - // Tapping should create a new funding cycle. - const expectedFundingCycleId3 = incrementFundingCycleIdFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap, currency, 0] - }); - return { expectedFundingCycleId3 }; - } - }, - { - description: "The current should have the tapped amount", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - originalTimeMark, - cycleLimit, - ballot, - discountRate, - duration, - target, - amountToTap, - expectedFundingCycleId3, - expectedPackedMetadata, - expectedInitialWeight, - expectedFee - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId3, - expectedProjectId, - expectedFundingCycleNumber1.add(1), - expectedFundingCycleId1, - originalTimeMark, - cycleLimit.eq(0) ? BigNumber.from(0) : cycleLimit.sub(1), - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate)) - .div(constants.DiscountRatePercentDenominator), - ballot, - originalTimeMark.add(duration.mul(86400)), - duration, - target, - BigNumber.from(currency), - expectedFee, - discountRate, - amountToTap, - expectedPackedMetadata - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/set_payout_mods.js b/packages/hardhat/test/integration/workflows/set_payout_mods.js deleted file mode 100644 index f75ffe65f9..0000000000 --- a/packages/hardhat/test/integration/workflows/set_payout_mods.js +++ /dev/null @@ -1,400 +0,0 @@ -/** - Project's can set payout mods, which allow payouts to automatically be - sent to either an address, another project on Juicebox, or a contract that inherits from IModAllocator. - - A payout mod can be locked until a specified timestamp, which prevents it from being removed while - the current funding cycle configuration is active. - - If a project reconfigures its funding cycle, new mods can be set that override any locked payout mods. - These new mods will take effect once the reconfigured funding cycle becomes active. -*/ - -module.exports = [ - { - description: "Deploy first project with at least a locked payout mod", - fn: async ({ - constants, - contracts, - executeFn, - BigNumber, - randomSignerFn, - randomBigNumberFn, - randomBytesFn, - getTimestampFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project with mods. - const owner = randomSignerFn(); - - // Payment mods can be locked. - // Make a locked mods. - const lockedMod1 = { - preferUnstaked: randomBoolFn(), - // Arbitrary percent that adds up to <= 100% across all mods. - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(2) - }).toNumber(), - // Lock at least until the end of the tests. - lockedUntil: (await getTimestampFn()) - .add( - randomBigNumberFn({ - min: BigNumber.from(1000), - max: BigNumber.from(100000000) - }) - ) - .toNumber(), - beneficiary: randomAddressFn(), - allocator: constants.AddressZero, - projectId: BigNumber.from(0) - }; - const unlockedMod1 = { - preferUnstaked: randomBoolFn(), - // Arbitrary percent that adds up to <= 100% across all mods. - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(4) - }).toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn(), - allocator: constants.AddressZero, - projectId: BigNumber.from(0) - }; - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [lockedMod1, unlockedMod1], - [] - ] - }); - - return { - owner, - expectedProjectId, - lockedMod1, - unlockedMod1 - }; - } - }, - { - description: "Check that the payout mod got set", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { expectedProjectId, lockedMod1, unlockedMod1 } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "payoutModsOf", - args: [expectedProjectId, timeMark], - expect: [ - [ - lockedMod1.preferUnstaked, - lockedMod1.percent, - lockedMod1.lockedUntil, - lockedMod1.beneficiary, - lockedMod1.allocator, - lockedMod1.projectId - ], - [ - unlockedMod1.preferUnstaked, - unlockedMod1.percent, - unlockedMod1.lockedUntil, - unlockedMod1.beneficiary, - unlockedMod1.allocator, - unlockedMod1.projectId - ] - ] - }); - return { configurationTimeMark: timeMark }; - } - }, - { - description: - "Overriding a locked mod shouldn't work when setting payout mods", - fn: async ({ - contracts, - executeFn, - BigNumber, - deployContractFn, - randomBoolFn, - randomAddressFn, - timeMark, - constants, - randomBigNumberFn, - local: { owner, expectedProjectId, unlockedMod1 } - }) => { - const unlockedMod2 = { - preferUnstaked: randomBoolFn(), - // Arbitrary percent that adds up to <= 100% across all mods. - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(5) - }).toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn(), - allocator: (await deployContractFn("ExampleModAllocator")).address, - projectId: BigNumber.from(0) - }; - await executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setPayoutMods", - args: [expectedProjectId, timeMark, [unlockedMod1, unlockedMod2]], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }); - - return { unlockedMod2 }; - } - }, - { - description: - "Overriding a locked mod with a shorter locked date shouldn't work when setting payout mods", - fn: ({ - contracts, - executeFn, - timeMark, - local: { - owner, - expectedProjectId, - lockedMod1, - unlockedMod1, - unlockedMod2 - } - }) => - executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setPayoutMods", - args: [ - expectedProjectId, - timeMark, - [ - { - ...lockedMod1, - lockedUntil: lockedMod1.lockedUntil - 1 - }, - unlockedMod1, - unlockedMod2 - ] - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - }, - { - description: "Set new payout mods, making sure to include any locked mods", - fn: ({ - contracts, - executeFn, - timeMark, - local: { owner, expectedProjectId, unlockedMod2, lockedMod1 } - }) => - executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setPayoutMods", - args: [ - expectedProjectId, - timeMark, - [ - { - ...lockedMod1, - lockedUntil: lockedMod1.lockedUntil + 1 - }, - unlockedMod2 - ] - ] - }) - }, - { - description: "Check that the new payout mods got set correctly", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - lockedMod1, - unlockedMod2, - configurationTimeMark - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "payoutModsOf", - // Subtract 1 from timeMark to get the time of the configuration execution. - args: [expectedProjectId, configurationTimeMark], - expect: [ - [ - lockedMod1.preferUnstaked, - lockedMod1.percent, - lockedMod1.lockedUntil + 1, - lockedMod1.beneficiary, - lockedMod1.allocator, - lockedMod1.projectId - ], - [ - unlockedMod2.preferUnstaked, - unlockedMod2.percent, - unlockedMod2.lockedUntil, - unlockedMod2.beneficiary, - unlockedMod2.allocator, - unlockedMod2.projectId - ] - ] - }) - }, - { - description: - "Configuring a project should allow overriding locked mods for the new configuration", - fn: ({ - constants, - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - local: { owner, expectedProjectId, unlockedMod1 } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [unlockedMod1], - [] - ] - }) - }, - { - description: "Check that the new configuration has its mods", - fn: ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { expectedProjectId, unlockedMod1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "payoutModsOf", - args: [expectedProjectId, timeMark], - expect: [ - [ - unlockedMod1.preferUnstaked, - unlockedMod1.percent, - unlockedMod1.lockedUntil, - unlockedMod1.beneficiary, - unlockedMod1.allocator, - unlockedMod1.projectId - ] - ] - }) - }, - { - description: "Check that the old configuration still has its mods", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - lockedMod1, - unlockedMod2, - configurationTimeMark - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "payoutModsOf", - // Subtract 2 from timeMark to get the time of the configuration execution. - args: [expectedProjectId, configurationTimeMark], - expect: [ - [ - lockedMod1.preferUnstaked, - lockedMod1.percent, - lockedMod1.lockedUntil + 1, - lockedMod1.beneficiary, - lockedMod1.allocator, - lockedMod1.projectId - ], - [ - unlockedMod2.preferUnstaked, - unlockedMod2.percent, - unlockedMod2.lockedUntil, - unlockedMod2.beneficiary, - unlockedMod2.allocator, - unlockedMod2.projectId - ] - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/set_terminal.js b/packages/hardhat/test/integration/workflows/set_terminal.js deleted file mode 100644 index 40288b2ecd..0000000000 --- a/packages/hardhat/test/integration/workflows/set_terminal.js +++ /dev/null @@ -1,357 +0,0 @@ -/** - A project can be created without specifying a payment terminal. - The project will have to set a terminal before it can print tickets or configure its funding cycles. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Create a project with no payment terminal", - fn: async ({ - constants, - contracts, - executeFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - randomBytesFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - constants.AddressZero - ] - }); - return { owner, expectedProjectId }; - } - }, - { - description: "Make sure the terminal was not set in the directory", - fn: ({ - checkFn, - randomSignerFn, - contracts, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: constants.AddressZero - }) - }, - { - description: "Shouldn't be able to print premined tickets", - fn: ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomStringFn, - randomAddressFn, - randomBoolFn, - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - randomBigNumberFn({ - min: BigNumber.from(0), - max: BigNumber.from(10).pow(30) - }), - currency, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - revert: "TerminalUtility: UNAUTHORIZED" - }) - }, - { - description: "Shouldn't be able to configure", - fn: ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ max: constants.MaxPercent }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ], - revert: "TerminalUtility: UNAUTHORIZED" - }) - }, - { - description: "Shouldn't be able to pay", - fn: async ({ - contracts, - randomBigNumberFn, - getBalanceFn, - executeFn, - randomStringFn, - randomBoolFn, - randomAddressFn, - randomSignerFn, - BigNumber, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue, - revert: "TerminalUtility: UNAUTHORIZED" - }); - return { payer, paymentValue }; - } - }, - { - description: "Set a payment terminal", - fn: ({ executeFn, contracts, local: { expectedProjectId, owner } }) => - executeFn({ - caller: owner, - contract: contracts.terminalDirectory, - fn: "setTerminal", - args: [expectedProjectId, contracts.terminalV1.address] - }) - }, - { - description: "Should now be able to print premined tickets", - fn: ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomStringFn, - randomAddressFn, - randomBoolFn, - - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "printPreminedTickets", - args: [ - expectedProjectId, - // Use an arbitrary large big number that can be added to other large big numbers without risk of running into uint256 boundaries. - randomBigNumberFn({ - min: BigNumber.from(1), - max: BigNumber.from(10).pow(30) - }), - currency, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ] - }) - }, - { - description: "Should now be able to configure", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { expectedProjectId, owner } - }) => { - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: randomBigNumberFn({ max: constants.MaxPercent }), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - } - }, - { - description: "Should now be able to pay", - fn: ({ - executeFn, - contracts, - randomAddressFn, - randomStringFn, - randomBoolFn, - local: { expectedProjectId, payer, paymentValue } - }) => - executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }) - }, - { - description: - "Setting a new terminal before migration to it has been allowed shouldnt be allowed", - fn: async ({ - executeFn, - contracts, - deployContractFn, - local: { expectedProjectId, owner } - }) => { - // The terminalV1 that will be migrated to. - const secondTerminalV1 = await deployContractFn("TerminalV1", [ - contracts.projects.address, - contracts.fundingCycles.address, - contracts.ticketBooth.address, - contracts.operatorStore.address, - contracts.modStore.address, - contracts.prices.address, - contracts.terminalDirectory.address, - contracts.governance.address - ]); - await executeFn({ - caller: owner, - contract: contracts.terminalDirectory, - fn: "setTerminal", - args: [expectedProjectId, secondTerminalV1.address], - revert: "TerminalDirectory::setTerminal: UNAUTHORIZED" - }); - - return { secondTerminalV1 }; - } - }, - // Allow migration to a new terminal. - { - description: "Allow a migration to a new terminalV1", - fn: ({ deployer, contracts, executeFn, local: { secondTerminalV1 } }) => - executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "allowMigration", - args: [contracts.terminalV1.address, secondTerminalV1.address] - }) - }, - { - description: - "Set a terminal that can be migrated to from the current terminal should be allowed", - fn: ({ - executeFn, - contracts, - local: { expectedProjectId, owner, secondTerminalV1 } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalDirectory, - fn: "setTerminal", - args: [expectedProjectId, secondTerminalV1.address] - }) - }, - { - description: "The new terminal should be set", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { expectedProjectId, secondTerminalV1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalDirectory, - fn: "terminalOf", - args: [expectedProjectId], - expect: secondTerminalV1.address - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/set_ticket_mods.js b/packages/hardhat/test/integration/workflows/set_ticket_mods.js deleted file mode 100644 index ea77cd346e..0000000000 --- a/packages/hardhat/test/integration/workflows/set_ticket_mods.js +++ /dev/null @@ -1,362 +0,0 @@ -/** - Project's can set ticket mods, which allow reserved tickets to be automatically sent to an address. - - A ticket mod can be locked until a specified timestamp, which prevents it from being removed while - the current funding cycle configuration is active. - - If a project reconfigures its funding cycle, new mods can be set that override any locked payout mods. - These new mods will take effect once the reconfigured funding cycle becomes active. -*/ -module.exports = [ - { - description: "Deploy first project with at least a locked ticket mod", - fn: async ({ - constants, - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomBytesFn, - getTimestampFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - randomSignerFn, - incrementProjectIdFn, - incrementFundingCycleIdFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project with mods. - const owner = randomSignerFn(); - - // Ticket mods can be locked. - const lockedMod = { - preferUnstaked: randomBoolFn(), - // Arbitrary percent that adds up to <= 100% across all mods. - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(2) - }).toNumber(), - // Lock at least until the end of the tests. - lockedUntil: (await getTimestampFn()) - .add( - randomBigNumberFn({ - min: BigNumber.from(1000), - max: BigNumber.from(100000000) - }) - ) - .toNumber(), - beneficiary: randomAddressFn() - }; - const unlockedMod1 = { - preferUnstaked: randomBoolFn(), - // Arbitrary percent that adds up to <= 100% across all mods. - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(4) - }).toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn() - }; - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [lockedMod, unlockedMod1] - ] - }); - return { owner, expectedProjectId, lockedMod, unlockedMod1 }; - } - }, - { - description: "Check that the ticket mods got set", - fn: async ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { expectedProjectId, lockedMod, unlockedMod1 } - }) => { - await checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "ticketModsOf", - args: [expectedProjectId, timeMark], - expect: [ - [ - lockedMod.preferUnstaked, - lockedMod.percent, - lockedMod.lockedUntil, - lockedMod.beneficiary - ], - [ - unlockedMod1.preferUnstaked, - unlockedMod1.percent, - unlockedMod1.lockedUntil, - unlockedMod1.beneficiary - ] - ] - }); - return { configurationTimeMark: timeMark }; - } - }, - { - description: - "Overriding a locked mod shouldn't work when setting ticket mods", - fn: async ({ - contracts, - executeFn, - randomBoolFn, - randomAddressFn, - timeMark, - constants, - randomBigNumberFn, - BigNumber, - local: { owner, expectedProjectId, unlockedMod1 } - }) => { - // Arbitrary percent that adds up to <= 100% across all mods. - const unlockedMod2 = { - preferUnstaked: randomBoolFn(), - percent: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.div(5) - }).toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn() - }; - await executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setTicketMods", - args: [expectedProjectId, timeMark, [unlockedMod1, unlockedMod2]], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }); - return { unlockedMod2 }; - } - }, - { - description: - "Overriding a locked mod with a shorter locked date shouldn't work when setting ticket mods", - fn: ({ - contracts, - executeFn, - timeMark, - local: { owner, expectedProjectId, lockedMod, unlockedMod1, unlockedMod2 } - }) => - executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setTicketMods", - args: [ - expectedProjectId, - timeMark, - [ - { - ...lockedMod, - lockedUntil: lockedMod.lockedUntil - 1 - }, - unlockedMod1, - unlockedMod2 - ] - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - }, - { - description: "Set new ticket mods, making sure to include any locked mods", - fn: ({ - contracts, - executeFn, - timeMark, - local: { owner, expectedProjectId, lockedMod, unlockedMod2 } - }) => - executeFn({ - caller: owner, - contract: contracts.modStore, - fn: "setTicketMods", - args: [ - expectedProjectId, - timeMark, - [ - { - ...lockedMod, - lockedUntil: lockedMod.lockedUntil + 1 - }, - unlockedMod2 - ] - ] - }) - }, - { - description: "Check that the new payout mods got set correctly", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - lockedMod, - unlockedMod2, - configurationTimeMark - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "ticketModsOf", - // Subtract 1 from timeMark to get the time of the configuration execution. - args: [expectedProjectId, configurationTimeMark], - expect: [ - [ - lockedMod.preferUnstaked, - lockedMod.percent, - lockedMod.lockedUntil + 1, - lockedMod.beneficiary - ], - [ - unlockedMod2.preferUnstaked, - unlockedMod2.percent, - unlockedMod2.lockedUntil, - unlockedMod2.beneficiary - ] - ] - }) - }, - { - description: - "Configuring a project should allow overriding locked mods for the new configuration", - fn: ({ - constants, - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - local: { owner, expectedProjectId, unlockedMod1 } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [unlockedMod1] - ] - }) - }, - { - description: "Check that the new configuration has its mods", - fn: ({ - contracts, - checkFn, - randomSignerFn, - timeMark, - local: { expectedProjectId, unlockedMod1 } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "ticketModsOf", - args: [expectedProjectId, timeMark], - expect: [ - [ - unlockedMod1.preferUnstaked, - unlockedMod1.percent, - unlockedMod1.lockedUntil, - unlockedMod1.beneficiary - ] - ] - }) - }, - { - description: "Check that the old configuration still has its mods", - fn: ({ - contracts, - checkFn, - randomSignerFn, - local: { - expectedProjectId, - lockedMod, - unlockedMod2, - configurationTimeMark - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "ticketModsOf", - // Subtract 2 from timeMark to get the time of the configuration execution. - args: [expectedProjectId, configurationTimeMark], - expect: [ - [ - lockedMod.preferUnstaked, - lockedMod.percent, - lockedMod.lockedUntil + 1, - lockedMod.beneficiary - ], - [ - unlockedMod2.preferUnstaked, - unlockedMod2.percent, - unlockedMod2.lockedUntil, - unlockedMod2.beneficiary - ] - ] - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/take_fee.js b/packages/hardhat/test/integration/workflows/take_fee.js deleted file mode 100644 index 572dd756dc..0000000000 --- a/packages/hardhat/test/integration/workflows/take_fee.js +++ /dev/null @@ -1,271 +0,0 @@ -/** - When a project's funds are tapped, the governance project should take a fee through its current terminal. -*/ - -const { BigNumber } = require("ethers"); - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy a project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - getBalanceFn, - randomStringFn, - incrementProjectIdFn, - incrementFundingCycleIdFn, - randomSignerFn, - randomBytesFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project with mods. - // Exclude the governance project's owner to make the test calculations cleaner. - const owner = randomSignerFn(); - - // An account that will be used to make a payment. - const payer = randomSignerFn(); - - // One payments will be made. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - // Two amounts need to be tapped, so make the minimum an amount at least 2. - min: BigNumber.from(2), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // Make the target the payment value to make some of the test cases cleaner. - const target = paymentValue; - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target, - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - // Recurring. - discountRate: randomBigNumberFn({ - max: constants.MaxPercent.sub(1) - }), - ballot: constants.AddressZero - }, - { - // Don't use a reserved rate to make the calculations a little simpler. - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { - owner, - payer, - paymentValue, - expectedProjectId, - target - }; - } - }, - { - description: "Make a payment to the project", - fn: ({ - contracts, - executeFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - local: { payer, paymentValue, expectedProjectId } - }) => - executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }) - }, - { - description: "Tap funds for the project to incure the fee", - fn: async ({ - contracts, - executeFn, - randomSignerFn, - randomBigNumberFn, - constants, - local: { target, expectedProjectId } - }) => { - // Tap some of the target. - const amountToTap1 = target.sub( - randomBigNumberFn({ min: BigNumber.from(1), max: target.sub(1) }) - ); - - // Save the initial balances of the owner, address mod beneficiary, and the allocator mod contract. - const governanceInitialBalance = await contracts.terminalV1.balanceOf( - constants.GovernanceProjectId - ); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap1, currency, amountToTap1] - }); - - return { - amountToTap1, - governanceInitialBalance - }; - } - }, - { - description: "Check that the governance project now has a balance", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { amountToTap1, governanceInitialBalance } - }) => { - // A fee should be taken. - const expectedFeeAmount1 = amountToTap1.sub( - amountToTap1 - .mul(constants.MaxPercent) - .div((await contracts.terminalV1.fee()).add(constants.MaxPercent)) - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [constants.GovernanceProjectId], - expect: governanceInitialBalance.add(expectedFeeAmount1) - }); - - return { expectedFeeAmount1 }; - } - }, - { - description: "Allow migration to a new terminalV1", - fn: async ({ deployer, contracts, executeFn, deployContractFn }) => { - // The terminalV1 that will be migrated to. - const secondTerminalV1 = await deployContractFn("TerminalV1", [ - contracts.projects.address, - contracts.fundingCycles.address, - contracts.ticketBooth.address, - contracts.operatorStore.address, - contracts.modStore.address, - contracts.prices.address, - contracts.terminalDirectory.address, - contracts.governance.address - ]); - - await executeFn({ - caller: deployer, - contract: contracts.governance, - fn: "allowMigration", - args: [contracts.terminalV1.address, secondTerminalV1.address] - }); - - return { secondTerminalV1 }; - } - }, - { - description: "Migrating to the new terminalV1", - fn: async ({ - contracts, - executeFn, - local: { owner, expectedProjectId, secondTerminalV1 } - }) => - executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "migrate", - args: [expectedProjectId, secondTerminalV1.address] - }) - }, - { - description: - "Tap funds for the project in the second terminalV1 to incure the fee", - fn: async ({ - executeFn, - randomSignerFn, - local: { target, expectedProjectId, amountToTap1, secondTerminalV1 } - }) => { - // Tap the other portion of the target. - const amountToTap2 = target.sub(amountToTap1); - - await executeFn({ - caller: randomSignerFn(), - contract: secondTerminalV1, - fn: "tap", - args: [expectedProjectId, amountToTap2, currency, amountToTap2] - }); - - return { - amountToTap2 - }; - } - }, - { - description: - "Check that the governance project got the fee in its terminal", - fn: async ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { amountToTap2, governanceInitialBalance, expectedFeeAmount1 } - }) => { - // A fee should be taken. - const expectedFeeAmount2 = amountToTap2.sub( - amountToTap2 - .mul(constants.MaxPercent) - .div((await contracts.terminalV1.fee()).add(constants.MaxPercent)) - ); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [constants.GovernanceProjectId], - expect: governanceInitialBalance - .add(expectedFeeAmount1) - .add(expectedFeeAmount2) - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/tap.js b/packages/hardhat/test/integration/workflows/tap.js deleted file mode 100644 index f192c72e27..0000000000 --- a/packages/hardhat/test/integration/workflows/tap.js +++ /dev/null @@ -1,637 +0,0 @@ -/** - Anyone can tap funds on behalf of a project. - - When a project is tapped, it will issue the appropriate payouts to its mods, and will send - any leftover funds to the project owner. - - Payment mods allow payouts to automatically be sent to either an address, another project on Juicebox, or a contract that inherits from IModAllocator. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -module.exports = [ - { - description: "Deploy first project with a payout mod", - fn: async ({ - constants, - contracts, - executeFn, - BigNumber, - deployContractFn, - randomBigNumberFn, - getBalanceFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - incrementProjectIdFn, - incrementFundingCycleIdFn, - randomSignerFn, - randomBytesFn - }) => { - const expectedIdOfBaseProject = incrementProjectIdFn(); - const expectedIdOfModProject = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project with mods. - // Exclude the governance project's owner to make the test calculations cleaner. - const owner = randomSignerFn({ exclude: [constants.GovenanceOwner] }); - - // An account that will be used to make a payment. - const payer = randomSignerFn(); - - // Two payments will be made. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The target must at most be the payment value. - const target = randomBigNumberFn({ - min: BigNumber.from(1), - max: paymentValue1 - }); - - const duration = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - - // The mod percents should add up to <= constants.MaxPercent. - const percent1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.sub(2) - }); - const percent2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.sub(percent1).sub(1) - }); - const percent3 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxModPercent.sub(percent1).sub(percent2) - }); - - // There are three types of mods. - // Address mods route payout directly to an address. - const addressMod = { - preferUnstaked: randomBoolFn(), - percent: percent1.toNumber(), - lockedUntil: 0, - // Make sure the beneficiary isnt the owner. - beneficiary: randomAddressFn({ - exclude: [owner.address] - }), - allocator: constants.AddressZero, - projectId: BigNumber.from(0) - }; - // Project mods route payout directly to another project on TerminalV1. - const projectMod = { - preferUnstaked: randomBoolFn(), - percent: percent2.toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn(), - allocator: constants.AddressZero, - projectId: expectedIdOfModProject - }; - // Allocator mods route payments directly to the specified contract that inherits from IModAllocator. - const allocatorMod = { - preferUnstaked: randomBoolFn(), - percent: percent3.toNumber(), - lockedUntil: 0, - beneficiary: randomAddressFn(), - allocator: (await deployContractFn("ExampleModAllocator")).address, - projectId: BigNumber.from(0) - }; - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedIdOfBaseProject.toString() - }), - randomStringFn(), - { - target, - currency, - duration, - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - // Recurring. - discountRate: randomBigNumberFn({ - max: constants.MaxPercent.sub(1) - }), - ballot: constants.AddressZero - }, - { - // Don't use a reserved rate to make the calculations a little simpler. - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [addressMod, projectMod, allocatorMod], - [] - ] - }); - return { - owner, - payer, - paymentValue1, - expectedIdOfBaseProject, - expectedIdOfModProject, - duration, - target, - addressMod, - projectMod, - allocatorMod - }; - } - }, - { - description: "Check that the payout mods got set", - fn: ({ - contracts, - checkFn, - timeMark, - randomSignerFn, - local: { expectedIdOfBaseProject, addressMod, projectMod, allocatorMod } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.modStore, - fn: "payoutModsOf", - args: [expectedIdOfBaseProject, timeMark], - expect: [ - [ - addressMod.preferUnstaked, - addressMod.percent, - addressMod.lockedUntil, - addressMod.beneficiary, - addressMod.allocator, - addressMod.projectId - ], - [ - projectMod.preferUnstaked, - projectMod.percent, - projectMod.lockedUntil, - projectMod.beneficiary, - projectMod.allocator, - projectMod.projectId - ], - [ - allocatorMod.preferUnstaked, - allocatorMod.percent, - allocatorMod.lockedUntil, - allocatorMod.beneficiary, - allocatorMod.allocator, - allocatorMod.projectId - ] - ] - }) - }, - { - description: - "Deploy second project that'll be sent funds by the configured project payout mod", - fn: async ({ - constants, - contracts, - executeFn, - BigNumber, - randomBytesFn, - randomBigNumberFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - local: { duration, expectedIdOfModProject, owner } - }) => { - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the mod project. - // exlcude the owner address and the governance owner to make the test calculations cleaner. - const modProjectOwner = randomSignerFn({ - exclude: [owner.address, constants.GovenanceOwner] - }); - - // If this funding cycle duration is too much smaller than - // the base cycle's duration (< 1/30), the program could break because it - // could have to apply the discount rate exponentially according to the factor in the worst case. - // This worse case only happens when the smaller cycle isnt tapped or configured for a long while. - const duration2 = randomBigNumberFn({ - min: duration < 500 ? BigNumber.from(1) : duration.div(500), - max: constants.MaxUint16 - }); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - modProjectOwner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedIdOfModProject.toString() - }), - randomStringFn(), - { - target: randomBigNumberFn(), - currency: randomBigNumberFn({ max: constants.MaxUint8 }), - duration: duration2, - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - // Make it recurring. - discountRate: randomBigNumberFn({ - max: constants.MaxPercent.sub(1) - }), - ballot: constants.AddressZero - }, - { - // Don't use a reserved rate to make the calculations a little simpler. - reservedRate: BigNumber.from(0), - bondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }), - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - - return { modProjectOwner }; - } - }, - { - description: - "Issue the project's tickets so that the unstaked preference can be checked", - fn: ({ - contracts, - executeFn, - randomStringFn, - local: { modProjectOwner, expectedIdOfModProject } - }) => - executeFn({ - caller: modProjectOwner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedIdOfModProject, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: "Make a payment to the project", - fn: ({ - contracts, - executeFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - local: { payer, paymentValue1, expectedIdOfBaseProject } - }) => - executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedIdOfBaseProject, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue1 - }) - }, - { - description: "The second project should have no balance", - fn: ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { expectedIdOfModProject } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [expectedIdOfModProject], - expect: BigNumber.from(0) - }) - }, - { - description: "Tap funds for the project with payout mods", - fn: async ({ - contracts, - executeFn, - randomSignerFn, - getBalanceFn, - constants, - local: { - target, - owner, - expectedIdOfBaseProject, - addressMod, - allocatorMod - } - }) => { - // An amount up to the target can be tapped. - const amountToTap = target; - - // Save the initial balances of the owner, address mod beneficiary, and the allocator mod contract. - const ownerInitialBalance = await getBalanceFn(owner.address); - - const addressModBeneficiaryInitialBalance = await getBalanceFn( - addressMod.beneficiary - ); - const allocatorModContractInitialBalance = await getBalanceFn( - allocatorMod.allocator - ); - - // Save the amount of governance project tickets the owner has owner initially has. - const initialOwnerTicketBalanceOfGovernanceProject = await contracts.ticketBooth.balanceOf( - owner.address, - constants.GovernanceProjectId - ); - - await executeFn({ - // Dont use the owner or address mod beneficiary or else the gas spent will mess up the calculation. - caller: randomSignerFn({ - exclude: [addressMod.beneficiary, owner.address] - }), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedIdOfBaseProject, amountToTap, currency, amountToTap] - }); - - return { - amountToTap, - addressModBeneficiaryInitialBalance, - allocatorModContractInitialBalance, - ownerInitialBalance, - initialOwnerTicketBalanceOfGovernanceProject - }; - } - }, - { - description: "Check that payout mod beneficiary has expected funds", - fn: async ({ - constants, - contracts, - verifyBalanceFn, - local: { addressMod, amountToTap, addressModBeneficiaryInitialBalance } - }) => { - // The amount tapped takes into account any fees paid. - const expectedAmountTapped = amountToTap - .mul(constants.MaxPercent) - .div((await contracts.terminalV1.fee()).add(constants.MaxPercent)); - - await verifyBalanceFn({ - address: addressMod.beneficiary, - expect: addressModBeneficiaryInitialBalance.add( - expectedAmountTapped - .mul(addressMod.percent) - .div(constants.MaxModPercent) - ) - }); - - return { expectedAmountTapped }; - } - }, - { - description: "Check that the second project now has a balance", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { projectMod, expectedAmountTapped, expectedIdOfModProject } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "balanceOf", - args: [expectedIdOfModProject], - expect: expectedAmountTapped - .mul(projectMod.percent) - .div(constants.MaxModPercent) - }) - }, - { - description: "Check that the beneficiary of the project mod got tickets", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { expectedIdOfModProject, projectMod, expectedAmountTapped } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [projectMod.beneficiary, expectedIdOfModProject], - expect: expectedAmountTapped - .mul(projectMod.percent) - .div(constants.MaxModPercent) - .mul(constants.InitialWeightMultiplier) - }) - }, - { - description: "Check for the correct number of staked tickets", - fn: ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { expectedIdOfModProject, projectMod, expectedAmountTapped } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [projectMod.beneficiary, expectedIdOfModProject], - expect: projectMod.preferUnstaked - ? BigNumber.from(0) - : expectedAmountTapped - .mul(projectMod.percent) - .div(constants.MaxModPercent) - .mul(constants.InitialWeightMultiplier) - }) - }, - { - description: "Check that mod's allocator got paid", - fn: ({ - constants, - verifyBalanceFn, - local: { - allocatorMod, - expectedAmountTapped, - allocatorModContractInitialBalance - } - }) => - verifyBalanceFn({ - address: allocatorMod.allocator, - expect: allocatorModContractInitialBalance.add( - expectedAmountTapped - .mul(allocatorMod.percent) - .div(constants.MaxModPercent) - ) - }) - }, - { - description: "Check that the project owner got any leftovers", - fn: ({ - verifyBalanceFn, - constants, - local: { - owner, - addressMod, - projectMod, - allocatorMod, - expectedAmountTapped, - ownerInitialBalance - } - }) => - verifyBalanceFn({ - address: owner.address, - expect: ownerInitialBalance.add( - expectedAmountTapped - .sub( - expectedAmountTapped - .mul(addressMod.percent) - .div(constants.MaxModPercent) - ) - .sub( - expectedAmountTapped - .mul(projectMod.percent) - .div(constants.MaxModPercent) - ) - .sub( - expectedAmountTapped - .mul(allocatorMod.percent) - .div(constants.MaxModPercent) - ) - ) - }) - }, - { - description: "Make sure the project owner got governance's project tickets", - fn: ({ - constants, - contracts, - checkFn, - randomSignerFn, - local: { - owner, - amountToTap, - expectedAmountTapped, - initialOwnerTicketBalanceOfGovernanceProject - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [owner.address, constants.GovernanceProjectId], - expect: initialOwnerTicketBalanceOfGovernanceProject.add( - amountToTap - .sub(expectedAmountTapped) - .mul(constants.InitialWeightMultiplier) - ) - }) - }, - { - description: - "Make another payment to the project to make sure it's got overflow", - fn: async ({ - contracts, - executeFn, - BigNumber, - randomBigNumberFn, - randomBoolFn, - randomStringFn, - randomAddressFn, - local: { payer, expectedIdOfBaseProject, target } - }) => { - // The second amount should cause overflow. - const paymentValue2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: target - }); - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedIdOfBaseProject, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue2 - }); - - return { paymentValue2 }; - } - }, - { - description: - "Shouldn't be able to tap excessive funds during the current funding cycle", - fn: ({ - contracts, - executeFn, - randomSignerFn, - local: { expectedIdOfBaseProject, paymentValue2 } - }) => - executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedIdOfBaseProject, paymentValue2, currency, paymentValue2], - revert: "FundingCycles::tap: INSUFFICIENT_FUNDS" - }) - }, - { - description: "Fast forward to the next funding cycle", - fn: ({ fastforwardFn, local: { duration } }) => - fastforwardFn(duration.mul(86400).add(1)) - }, - { - description: "Tap the full target", - fn: async ({ - contracts, - executeFn, - randomSignerFn, - incrementFundingCycleIdFn, - local: { expectedIdOfBaseProject, paymentValue2 } - }) => { - // A new funding cycle will be created. Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "tap", - args: [expectedIdOfBaseProject, paymentValue2, currency, paymentValue2] - }); - } - } -]; diff --git a/packages/hardhat/test/integration/workflows/ticket_locking_and transfers.js b/packages/hardhat/test/integration/workflows/ticket_locking_and transfers.js deleted file mode 100644 index c061033e18..0000000000 --- a/packages/hardhat/test/integration/workflows/ticket_locking_and transfers.js +++ /dev/null @@ -1,693 +0,0 @@ -/** - Tickets can be locked, which prevent them from being redeemed, unstaked, or transfered. -*/ - -module.exports = [ - { - description: "Deploy a project for the owner", - fn: async ({ - randomBigNumberFn, - getBalanceFn, - incrementProjectIdFn, - incrementFundingCycleIdFn, - randomSignerFn, - deployer, - constants, - contracts, - BigNumber, - executeFn, - randomBytesFn, - randomStringFn - }) => { - // Get the next project ID. - const expectedProjectId = incrementProjectIdFn(); - - // Burn the unused funding cycle ID id. - incrementFundingCycleIdFn(); - - // The owner of the project that will migrate. - const owner = randomSignerFn(); - - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // Two payments will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - // The project's funding cycle target will at most be a fourth of the payment value. Leaving plenty of overflow. - const target = randomBigNumberFn({ - max: paymentValue.div(4) - }); - - // The currency will be 0, which corresponds to ETH. - const currency = 0; - - // Set a random percentage of tickets to reserve for the project owner. - const reservedRate = randomBigNumberFn({ max: constants.MaxPercent }); - - // Set a random bonding curve rate. - const bondingCurveRate = randomBigNumberFn({ max: constants.MaxPercent }); - - await executeFn({ - caller: deployer, - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ prepend: expectedProjectId.toString() }), - randomStringFn(), - { - target, - currency, - duration: randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }), - cycleLimit: randomBigNumberFn({ - max: constants.MaxCycleLimit - }), - discountRate: randomBigNumberFn({ max: constants.MaxPercent }), - ballot: constants.AddressZero - }, - { - reservedRate, - bondingCurveRate, - reconfigurationBondingCurveRate: randomBigNumberFn({ - max: constants.MaxPercent - }) - }, - [], - [] - ] - }); - return { - expectedProjectId, - owner, - payer, - paymentValue, - reservedRate, - bondingCurveRate, - target - }; - } - }, - { - description: "Issue tickets", - fn: ({ - contracts, - executeFn, - randomStringFn, - local: { expectedProjectId, owner } - }) => - executeFn({ - caller: owner, - contract: contracts.ticketBooth, - fn: "issue", - args: [ - expectedProjectId, - randomStringFn({ canBeEmpty: false }), - randomStringFn({ canBeEmpty: false }) - ] - }) - }, - { - description: "Make a payment to the project to get some staked tickets", - fn: async ({ - executeFn, - contracts, - randomStringFn, - randomSignerFn, - getBalanceFn, - local: { expectedProjectId, payer, paymentValue } - }) => { - // An account that will be distributed tickets in the first payment. - const ticketBeneficiary = randomSignerFn(); - - const initialBalanceOfTicketBeneficiary = await getBalanceFn( - ticketBeneficiary.address - ); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - ticketBeneficiary.address, - randomStringFn(), - false // prefer staked - ], - value: paymentValue - }); - - return { ticketBeneficiary, initialBalanceOfTicketBeneficiary }; - } - }, - { - description: "The ticket beneficiary should have tickets", - fn: async ({ - constants, - checkFn, - randomSignerFn, - contracts, - local: { - expectedProjectId, - ticketBeneficiary, - paymentValue, - reservedRate - } - }) => { - const expectedTotalTicketBalance = paymentValue.mul( - constants.InitialWeightMultiplier - ); - - // The amount of tickets that will be expected to be staked after the first payment. - const expectedStakedBalance = paymentValue - .mul(constants.InitialWeightMultiplier) - .mul(constants.MaxPercent.sub(reservedRate)) - .div(constants.MaxPercent); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }); - - return { expectedStakedBalance, expectedTotalTicketBalance }; - } - }, - { - description: "The ticket beneficiary's tickets should all be staked", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, expectedStakedBalance } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: "Lock the staked tickets that wont be unstaked or transfered", - fn: async ({ - randomBigNumberFn, - BigNumber, - executeFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, expectedStakedBalance } - }) => { - // Unstake a portion of the staked balance. - const amountToUnstake = expectedStakedBalance.eq(0) - ? BigNumber.from(0) - : randomBigNumberFn({ - min: BigNumber.from(1), - max: expectedStakedBalance - }); - - // Transfer some of the staked tickets. - const amountToTransfer = expectedStakedBalance.gt(amountToUnstake) - ? randomBigNumberFn({ - min: BigNumber.from(1), - max: expectedStakedBalance.sub(amountToUnstake) - }) - : BigNumber.from(0); - - // Lock any staked balance leftover. - const amountToLock = expectedStakedBalance - .sub(amountToUnstake) - .sub(amountToTransfer); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "lock", - args: [ticketBeneficiary.address, expectedProjectId, amountToLock], - revert: amountToLock.eq(0) && "TicketBooth::lock: NO_OP" - }); - - return { amountToUnstake, amountToTransfer, amountToLock }; - } - }, - { - description: "Unstake some of the staked tickets", - fn: ({ - executeFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, amountToUnstake } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "unstake", - args: [ticketBeneficiary.address, expectedProjectId, amountToUnstake] - }) - }, - { - description: "The balance shouldn't have changed", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, expectedStakedBalance } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: "The staked balance should be updated", - fn: ({ - checkFn, - randomSignerFn, - contracts, - local: { - expectedProjectId, - ticketBeneficiary, - expectedStakedBalance, - amountToUnstake - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance.sub(amountToUnstake), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: "Transfer some staked tickets to another address", - fn: async ({ - executeFn, - contracts, - randomSignerFn, - local: { expectedProjectId, ticketBeneficiary, amountToTransfer } - }) => { - // An account that will be transfered tickets from the beneficiary. - const ticketTransferRecipient = randomSignerFn(); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "transfer", - args: [ - ticketBeneficiary.address, - expectedProjectId, - amountToTransfer, - ticketTransferRecipient.address - ], - revert: - ticketBeneficiary.address === ticketTransferRecipient.address - ? "TicketBooth::transfer: IDENTITY" - : amountToTransfer.eq(0) && "TicketBooth::transfer: NO_OP" - }); - - return { ticketTransferRecipient }; - } - }, - { - description: "The balance should be updated to reflect the transfer", - fn: ({ - checkFn, - contracts, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary, - expectedStakedBalance, - amountToTransfer, - ticketTransferRecipient - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance.sub( - ticketBeneficiary.address !== ticketTransferRecipient.address - ? amountToTransfer - : BigNumber.from(0) - ), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: "The staked balance should be updated to reflect the transfer", - fn: ({ - checkFn, - contracts, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - ticketBeneficiary, - expectedStakedBalance, - amountToUnstake, - amountToTransfer, - ticketTransferRecipient - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: expectedStakedBalance - .sub(amountToUnstake) - .sub( - ticketBeneficiary.address !== ticketTransferRecipient.address - ? amountToTransfer - : BigNumber.from(0) - ), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: - "The balance of the recipient should be updated to reflect the transfer", - fn: ({ - checkFn, - contracts, - randomSignerFn, - local: { - expectedProjectId, - ticketTransferRecipient, - ticketBeneficiary, - expectedStakedBalance, - amountToTransfer - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketTransferRecipient.address, expectedProjectId], - expect: - ticketBeneficiary.address === ticketTransferRecipient.address - ? expectedStakedBalance - : amountToTransfer, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: - "The staked balance of the recipient should be updated to reflect the transfer", - fn: ({ - checkFn, - deployer, - contracts, - local: { - expectedProjectId, - ticketTransferRecipient, - ticketBeneficiary, - amountToUnstake, - expectedStakedBalance, - amountToTransfer - } - }) => - checkFn({ - caller: deployer, - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketTransferRecipient.address, expectedProjectId], - expect: - ticketBeneficiary.address === ticketTransferRecipient.address - ? expectedStakedBalance.sub(amountToUnstake) - : amountToTransfer, - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 100 - } - }) - }, - { - description: "Can't unstake any more because of the lock", - fn: ({ - executeFn, - contracts, - BigNumber, - local: { - amountToTransfer, - expectedProjectId, - ticketBeneficiary, - ticketTransferRecipient - } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "unstake", - args: [ticketBeneficiary.address, expectedProjectId, BigNumber.from(1)], - revert: - (amountToTransfer.eq(0) || - ticketBeneficiary.address !== ticketTransferRecipient.address) && - "TicketBooth::unstake: INSUFFICIENT_FUNDS" - }) - }, - { - description: "Can't transfer any more because of the lock", - fn: ({ - executeFn, - contracts, - BigNumber, - local: { expectedProjectId, ticketBeneficiary, ticketTransferRecipient } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "transfer", - args: [ - ticketBeneficiary.address, - expectedProjectId, - BigNumber.from(1), - ticketTransferRecipient.address - ], - revert: - ticketBeneficiary.address === ticketTransferRecipient.address - ? "TicketBooth::transfer: IDENTITY" - : "TicketBooth::transfer: INSUFFICIENT_FUNDS" - }) - }, - { - description: "Stake the unstaked tickets", - fn: ({ - executeFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, amountToUnstake } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "stake", - args: [ticketBeneficiary.address, expectedProjectId, amountToUnstake] - }) - }, - { - description: "Can't redeem because of the lock", - fn: async ({ - executeFn, - contracts, - randomAddressFn, - randomBoolFn, - local: { expectedProjectId, ticketBeneficiary, amountToLock } - }) => { - // Try redeeming everything except what was transfered away. - const ticketsToRedeem = await contracts.ticketBooth.balanceOf( - ticketBeneficiary.address, - expectedProjectId - ); - - // If the amount expected to be claimed is zero. - const expectedClaimedAmountIsZero = ( - await contracts.terminalV1.claimableOverflowOf( - ticketBeneficiary.address, - expectedProjectId, - ticketsToRedeem - ) - ).eq(0); - - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - ticketsToRedeem, - 0, - randomAddressFn(), - randomBoolFn() - ], - revert: - // No op if no tickets are being redeemed, or if there's no amount to claim. - ticketsToRedeem.eq(0) || expectedClaimedAmountIsZero - ? "TerminalV1::redeem: NO_OP" - : amountToLock.gt(0) && "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }); - - return { ticketsToRedeem, expectedClaimedAmountIsZero }; - } - }, - { - description: - "Other operators can't unlock what was locked by the beneficiary", - fn: async ({ - executeFn, - contracts, - randomSignerFn, - local: { expectedProjectId, ticketBeneficiary, amountToLock } - }) => { - const randomOtherSigner = randomSignerFn({ - exclude: [ticketBeneficiary.address] - }); - - await executeFn({ - caller: randomOtherSigner, - contract: contracts.ticketBooth, - fn: "unlock", - args: [ticketBeneficiary.address, expectedProjectId, amountToLock], - revert: amountToLock.eq(0) - ? "TicketBooth::unlock: NO_OP" - : "TicketBooth::unlock: INSUFFICIENT_FUNDS" - }); - } - }, - { - description: "Unlocks the locked funds if they already arent unlocked", - fn: ({ - executeFn, - contracts, - local: { expectedProjectId, ticketBeneficiary, amountToLock } - }) => - executeFn({ - caller: ticketBeneficiary, - contract: contracts.ticketBooth, - fn: "unlock", - args: [ticketBeneficiary.address, expectedProjectId, amountToLock], - // If there were no locked funds, no op. - revert: amountToLock.eq(0) && "TicketBooth::unlock: NO_OP" - }) - }, - { - description: - "Redeems correctly if the tickets haven't already been redeemed", - fn: async ({ - executeFn, - contracts, - randomAddressFn, - randomBoolFn, - local: { - expectedProjectId, - ticketBeneficiary, - ticketsToRedeem, - amountToLock, - expectedClaimedAmountIsZero - } - }) => { - await executeFn({ - caller: ticketBeneficiary, - contract: contracts.terminalV1, - fn: "redeem", - args: [ - ticketBeneficiary.address, - expectedProjectId, - ticketsToRedeem, - 0, - randomAddressFn(), - randomBoolFn() - ], - revert: - ticketsToRedeem.eq(0) || expectedClaimedAmountIsZero - ? "TerminalV1::redeem: NO_OP" - : // If the locked amount is zero, the tickets have already been redeemed. - amountToLock.eq(0) && - "TerminalV1::claimableOverflow: INSUFFICIENT_TICKETS" - }); - } - }, - { - description: "The balance should be 0", - fn: ({ - checkFn, - randomSignerFn, - contracts, - BigNumber, - local: { expectedProjectId, ticketBeneficiary } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "balanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: BigNumber.from(0), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000000 - } - }) - }, - { - description: - "The staked balance should be zero, or with a small margin of error caused by division rounding", - fn: ({ - checkFn, - randomSignerFn, - contracts, - BigNumber, - local: { expectedProjectId, ticketBeneficiary } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.ticketBooth, - fn: "stakedBalanceOf", - args: [ticketBeneficiary.address, expectedProjectId], - expect: BigNumber.from(0), - // Allow some wiggle room due to possible division precision errors. - plusMinus: { - amount: 10000000 - } - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/transfer_project_ownership.js b/packages/hardhat/test/integration/workflows/transfer_project_ownership.js deleted file mode 100644 index 465d0b1063..0000000000 --- a/packages/hardhat/test/integration/workflows/transfer_project_ownership.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - The governance of the TerminalV1 can transfer its power to a new address. - To do so, the governance must appoint a new address, and that address must accept the appointment. -*/ -module.exports = [ - { - description: "Create a project for the initial owner", - fn: async ({ - contracts, - constants, - executeFn, - randomStringFn, - randomSignerFn, - incrementProjectIdFn, - randomBytesFn - }) => { - const expectedProjectId = incrementProjectIdFn(); - - // The address that will own a project. - const owner = randomSignerFn(); - - await executeFn({ - caller: randomSignerFn(), - contract: contracts.projects, - fn: "create", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - constants.AddressZero - ] - }); - return { owner, expectedProjectId }; - } - }, - { - description: "The owner should be able to set a new uri for the project", - fn: ({ - contracts, - executeFn, - randomStringFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, randomStringFn()] - }) - }, - { - description: "Non owners that aren't operators cant set the uri", - fn: ({ - executeFn, - contracts, - randomStringFn, - randomSignerFn, - local: { owner, expectedProjectId } - }) => - executeFn({ - caller: randomSignerFn({ exclude: [owner.address] }), - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, randomStringFn()], - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "Transfer ownership to a new owner", - fn: async ({ - executeFn, - contracts, - randomSignerFn, - local: { owner, expectedProjectId } - }) => { - // The address that will own another project. - const secondOwner = randomSignerFn(); - await executeFn({ - caller: owner, - contract: contracts.projects, - fn: "transferFrom", - args: [owner.address, secondOwner.address, expectedProjectId] - }); - return { secondOwner }; - } - }, - { - description: - "The new owner should be able to set a new uri for the project", - fn: ({ - executeFn, - contracts, - randomStringFn, - local: { secondOwner, expectedProjectId } - }) => - executeFn({ - caller: secondOwner, - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, randomStringFn()] - }) - }, - { - description: "The old owner can no longer set the uri", - fn: ({ - executeFn, - contracts, - randomStringFn, - local: { owner, secondOwner, expectedProjectId } - }) => - executeFn({ - caller: owner, - contract: contracts.projects, - fn: "setUri", - args: [expectedProjectId, randomStringFn()], - revert: - owner.address !== secondOwner.address && "Operatable: UNAUTHORIZED" - }) - } -]; diff --git a/packages/hardhat/test/integration/workflows/zero_duration.js b/packages/hardhat/test/integration/workflows/zero_duration.js deleted file mode 100644 index e6a77d2136..0000000000 --- a/packages/hardhat/test/integration/workflows/zero_duration.js +++ /dev/null @@ -1,636 +0,0 @@ -/** - A funding cycle configuration can have a duration of 0. This makes the cycle last forever, and allows it to be reconfigurable at any time. -*/ - -// The currency will be 0, which corresponds to ETH, preventing the need for currency price conversion. -const currency = 0; - -// Expect the first funding cycle to be based on the 0th funding cycle. -const expectedInitialBasedOn = 0; - -module.exports = [ - { - description: "Deploy a project with 0 duration", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - randomBytesFn, - randomStringFn, - randomSignerFn, - incrementFundingCycleIdFn, - incrementProjectIdFn - }) => { - const expectedFundingCycleId1 = incrementFundingCycleIdFn(); - const expectedProjectId = incrementProjectIdFn(); - - // It should be the project's first budget. - const expectedFundingCycleNumber1 = BigNumber.from(1); - - // The owner of the project that will reconfigure. - const owner = randomSignerFn(); - - // At the end of the tests, this amount will be attempted to be tapped. - const amountToTap = BigNumber.from(1); - - // Make sure the target is arbitrarily larger than the amount that will be tapped, included fees that will be incurred. - const target1 = randomBigNumberFn({ min: amountToTap.mul(2) }); - - const duration1 = BigNumber.from(0); - - const cycleLimit1 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxCycleLimit - }); - - // dont allow non recurring. - const discountRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot1 = constants.AddressZero; - - const reservedRate1 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate1 = randomBigNumberFn({ - max: constants.MaxPercent - }); - await executeFn({ - caller: randomSignerFn(), - contract: contracts.terminalV1, - fn: "deploy", - args: [ - owner.address, - randomBytesFn({ - // Make sure its unique by prepending the id. - prepend: expectedProjectId.toString() - }), - randomStringFn(), - { - target: target1, - currency, - duration: duration1, - cycleLimit: cycleLimit1, - discountRate: discountRate1, - ballot: ballot1 - }, - { - reservedRate: reservedRate1, - bondingCurveRate: bondingCurveRate1, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate1 - }, - [], - [] - ] - }); - - return { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - owner, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1, - amountToTap - }; - } - }, - { - description: "Make sure the funding cycle got saved correctly", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - reconfigurationBondingCurveRate1, - bondingCurveRate1, - reservedRate1 - } - }) => { - // Pack the metadata as expected. - let expectedPackedMetadata1 = BigNumber.from(0); - expectedPackedMetadata1 = expectedPackedMetadata1.add( - reconfigurationBondingCurveRate1 - ); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(bondingCurveRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - expectedPackedMetadata1 = expectedPackedMetadata1.add(reservedRate1); - expectedPackedMetadata1 = expectedPackedMetadata1.shl(8); - - // Expect the funding cycle's weight to be the base weight. - const expectedInitialWeight = await contracts.fundingCycles.BASE_WEIGHT(); - - // Expect the funding cycle's fee to be the terminalV1's fee. - const expectedFee = await contracts.terminalV1.fee(); - - // Expect nothing to have been tapped yet from the funding cycle. - const expectedInitialTapped = BigNumber.from(0); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "get", - args: [expectedFundingCycleId1], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }); - return { - originalTimeMark: timeMark, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - }; - } - }, - { - description: "The funding cycle should be current", - fn: async ({ - contracts, - checkFn, - BigNumber, - timeMark, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - timeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - timeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "There should be no queued cycle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - constants.AddressZero, - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0) - ] - }) - }, - { - description: "Make a payment to the project to lock it in", - fn: async ({ - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - getBalanceFn, - randomStringFn, - randomAddressFn, - randomBoolFn, - randomSignerFn, - local: { expectedProjectId } - }) => { - // An account that will be used to make payments. - const payer = randomSignerFn(); - - // One payment will be made. Cant pay entire balance because some is needed for gas. - // So, arbitrarily divide the balance so that all payments can be made successfully. - const paymentValue = randomBigNumberFn({ - min: BigNumber.from(1), - max: (await getBalanceFn(payer.address)).div(100) - }); - - await executeFn({ - caller: payer, - contract: contracts.terminalV1, - fn: "pay", - args: [ - expectedProjectId, - randomAddressFn(), - randomStringFn(), - randomBoolFn() - ], - value: paymentValue - }); - } - }, - { - description: "Fastforward an arbitrary amount", - fn: async ({ fastforwardFn, randomBigNumberFn, BigNumber }) => - fastforwardFn( - randomBigNumberFn({ - min: BigNumber.from(1), - max: BigNumber.from(9999999999) - }) - ) - }, - { - description: "The funding cycle should be still current", - fn: async ({ - contracts, - checkFn, - BigNumber, - randomSignerFn, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleNumber1, - target1, - cycleLimit1, - ballot1, - duration1, - discountRate1, - expectedPackedMetadata1, - expectedInitialWeight, - expectedFee, - expectedInitialTapped, - originalTimeMark - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId1, - expectedProjectId, - expectedFundingCycleNumber1, - BigNumber.from(expectedInitialBasedOn), - originalTimeMark, - // Cycle limit should be 0 for the first funding cycle. - cycleLimit1, - expectedInitialWeight, - ballot1, - originalTimeMark, - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - }, - { - description: "There should still be no queued cycle", - fn: ({ - contracts, - checkFn, - randomSignerFn, - BigNumber, - constants, - local: { expectedProjectId } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: [ - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - constants.AddressZero, - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0), - BigNumber.from(0) - ] - }) - }, - { - description: "Reconfigure the project", - fn: async ({ - constants, - contracts, - executeFn, - randomBigNumberFn, - BigNumber, - incrementFundingCycleIdFn, - local: { owner, expectedProjectId } - }) => { - const expectedFundingCycleId2 = incrementFundingCycleIdFn(); - - const target2 = randomBigNumberFn(); - - const currency2 = randomBigNumberFn({ max: constants.MaxUint8 }); - const duration2 = randomBigNumberFn({ - min: BigNumber.from(1), - max: constants.MaxUint16 - }); - const cycleLimit2 = randomBigNumberFn({ - min: BigNumber.from(0), - max: constants.MaxCycleLimit - }); - - // Non recurring. - const discountRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const ballot2 = constants.AddressZero; - - const reservedRate2 = randomBigNumberFn({ max: constants.MaxPercent }); - const bondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - const reconfigurationBondingCurveRate2 = randomBigNumberFn({ - max: constants.MaxPercent - }); - - await executeFn({ - caller: owner, - contract: contracts.terminalV1, - fn: "configure", - args: [ - expectedProjectId, - { - target: target2, - currency: currency2, - duration: duration2, - cycleLimit: cycleLimit2, - discountRate: discountRate2, - ballot: ballot2 - }, - { - reservedRate: reservedRate2, - bondingCurveRate: bondingCurveRate2, - reconfigurationBondingCurveRate: reconfigurationBondingCurveRate2 - }, - [], - [] - ] - }); - return { - expectedFundingCycleId2, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2 - }; - } - }, - { - description: "Make sure the current configuration changed", - fn: async ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - expectedProjectId, - expectedFundingCycleId1, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - discountRate1, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - reconfigurationBondingCurveRate2, - bondingCurveRate2, - reservedRate2, - expectedInitialWeight, - expectedFee, - expectedInitialTapped - } - }) => { - let expectedPackedMetadata2 = BigNumber.from(0); - expectedPackedMetadata2 = expectedPackedMetadata2.add( - reconfigurationBondingCurveRate2 - ); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(bondingCurveRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - expectedPackedMetadata2 = expectedPackedMetadata2.add(reservedRate2); - expectedPackedMetadata2 = expectedPackedMetadata2.shl(8); - - await checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "currentOf", - args: [expectedProjectId], - expect: [ - expectedFundingCycleId2, - expectedProjectId, - expectedFundingCycleNumber1.add(1), - expectedFundingCycleId1, - timeMark, - cycleLimit2, - expectedInitialWeight - .mul(constants.DiscountRatePercentDenominator.sub(discountRate1)) - .div(constants.DiscountRatePercentDenominator), - ballot2, - timeMark, - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - }); - - return { expectedPackedMetadata2, expectedFundingCycleId2 }; - } - }, - { - description: "Make sure the queued configuration changed", - fn: ({ - constants, - contracts, - checkFn, - BigNumber, - randomSignerFn, - timeMark, - local: { - expectedProjectId, - expectedFundingCycleId2, - expectedFundingCycleNumber1, - discountRate1, - cycleLimit2, - ballot2, - duration2, - target2, - currency2, - discountRate2, - expectedInitialWeight, - expectedFee, - expectedInitialTapped, - expectedPackedMetadata2, - expectedFundingCycleId1, - originalTimeMark, - ballot1, - duration1, - target1, - expectedPackedMetadata1 - } - }) => - checkFn({ - caller: randomSignerFn(), - contract: contracts.fundingCycles, - fn: "queuedOf", - args: [expectedProjectId], - expect: !cycleLimit2.eq(1) - ? [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(2), - expectedFundingCycleId2, - timeMark, - cycleLimit2.eq(0) ? BigNumber.from(0) : cycleLimit2.sub(1), - expectedInitialWeight - .mul( - constants.DiscountRatePercentDenominator.sub(discountRate1) - ) - .div(constants.DiscountRatePercentDenominator) - .mul( - constants.DiscountRatePercentDenominator.sub(discountRate2) - ) - .div(constants.DiscountRatePercentDenominator), - ballot2, - timeMark.add(duration2.mul(86400)), - duration2, - target2, - currency2, - expectedFee, - discountRate2, - expectedInitialTapped, - expectedPackedMetadata2 - ] - : [ - BigNumber.from(0), - expectedProjectId, - expectedFundingCycleNumber1.add(2), - expectedFundingCycleId1, - originalTimeMark, - BigNumber.from(0), - expectedInitialWeight - .mul( - constants.DiscountRatePercentDenominator.sub(discountRate1) - ) - .div(constants.DiscountRatePercentDenominator) - .mul( - constants.DiscountRatePercentDenominator.sub(discountRate2) - ) - .div(constants.DiscountRatePercentDenominator), - ballot1, - timeMark.add(duration2.mul(86400)), - duration1, - target1, - BigNumber.from(currency), - expectedFee, - discountRate1, - expectedInitialTapped, - expectedPackedMetadata1 - ] - }) - } -]; diff --git a/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/index.js b/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/index.js deleted file mode 100644 index 0165b0e5ab..0000000000 --- a/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const receive = require("./receive"); - -module.exports = { - receive -}; diff --git a/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/receive.js b/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/receive.js deleted file mode 100644 index 304aaefaf0..0000000000 --- a/packages/hardhat/test/unit/behaviors/direct_payment_address/behaviors/receive.js +++ /dev/null @@ -1,80 +0,0 @@ -const { - ethers: { constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "no preset beneficiary or preference for unstaked tickets", - fn: ({ deployer }) => ({ - caller: deployer, - beneficiary: deployer.address, - preferUnstakedTickets: false, - // below values doesnt matter - value: 1 - }) - }, - { - description: "preset beneficiary, preset preference for unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - preferUnstakedTickets: true, - // below values doesnt matter - value: 1 - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - value, - beneficiary, - preferUnstakedTickets - } = successTest.fn(this); - - await this.terminalV1.mock.pay - .withArgs( - this.projectId, - beneficiary, - this.memo, - preferUnstakedTickets - ) - .returns(1); - await this.terminalDirectory.mock.unstakedTicketsPreferenceOf - .withArgs(caller.address) - .returns(preferUnstakedTickets); - await this.terminalDirectory.mock.beneficiaryOf - .withArgs(caller.address) - .returns(beneficiary || constants.AddressZero); - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(this.terminalV1.address); - - // Execute the transaction. - const tx = await caller.sendTransaction({ - to: this.contract.address, - value - }); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Forward") - .withArgs( - caller.address, - this.projectId, - beneficiary, - value, - this.memo, - preferUnstakedTickets - ); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/direct_payment_address/index.js b/packages/hardhat/test/unit/behaviors/direct_payment_address/index.js deleted file mode 100644 index d61d706e10..0000000000 --- a/packages/hardhat/test/unit/behaviors/direct_payment_address/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "DirectPaymentAddress"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - this.terminalV1 = await this.deployMockLocalContractFn("TerminalV1"); - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - this.projectId = 1; - this.memo = "some-memo"; - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.terminalDirectory.address, - this.projectId, - this.memo - ]); - }); - - // Test each function. - describe("receiver(...)", shouldBehaveLike.receive); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/configure.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/configure.js deleted file mode 100644 index f316c5d87f..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/configure.js +++ /dev/null @@ -1,1261 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const testTemplate = ({ - op = {}, - setup = {}, - preconfigure = {}, - fastforward, - ops = [], - expectation = {}, - revert -}) => ({ deployer, ballot }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - configureActiveFundingCycle: false, - setup: { - preconfigure: { - target: BigNumber.from(240), - currency: BigNumber.from(0), - duration: BigNumber.from(1), - discountRate: BigNumber.from(120), - cycleLimit: BigNumber.from(0), - fee: BigNumber.from(40), - metadata: BigNumber.from(3), - configureActiveFundingCycle: false, - ...preconfigure, - ballot: { - address: ballot.address, - duration: BigNumber.from(0), - ...preconfigure.ballot - } - }, - ops: [ - ...ops, - ...(fastforward - ? [ - { - type: "fastforward", - seconds: fastforward - } - ] - : []) - ], - ...setup - }, - expectation, - ...op, - revert -}); - -const tests = { - success: [ - { - description: "first funding cycle", - fn: testTemplate({ - setup: { - // no preconfiguration - preconfigure: null - }, - expectation: { - configuredNumber: 1, - configuredId: 1, - initId: 1, - basedOn: 0 - } - }) - }, - { - description: "during first funding cycle", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward to a time well within the preconfigured duration. - fastforward: BigNumber.from(86390), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "during first funding cycle with duration of 0", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(0) - }, - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: - "during first funding cycle with duration of 0, fastforwarded a bunch", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(0) - }, - fastforward: BigNumber.from(12345678), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "at the end of first funding cycle", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward to the last second of the preconfigured duration. - fastforward: BigNumber.from(86399), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "within the second funding cycle", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward to a second with the cycle after the preconfigured one. - fastforward: BigNumber.from(86401), - expectation: { - configuredNumber: 3, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "a few cycles after the first funding cycle", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward a multiple of the duration. - fastforward: BigNumber.from(86400 * 2 + 1), - expectation: { - configuredNumber: 4, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "many cycles after the first funding cycle", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward many multiples of the duration. - fastforward: BigNumber.from(86400 * 4 + 1), - expectation: { - configuredNumber: 6, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "during first funding cycle, configuring the active cycle", - fn: testTemplate({ - op: { - // Allow the active funding cycle to be reconfigured. - configureActiveFundingCycle: true - }, - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward within the preconfigured duration. - fastforward: BigNumber.from(36390), - expectation: { - configuredNumber: 1, - configuredId: 1, - basedOn: 0 - } - }) - }, - { - description: - "shortly after the first funding cycle, configuring the active cycle", - fn: testTemplate({ - op: { - // Allow the active funding cycle to be reconfigured. - configureActiveFundingCycle: true - }, - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - // Fast forward to the first second after the preconfigured cycle. - fastforward: BigNumber.from(86401), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "first funding cycle, max values", - fn: testTemplate({ - op: { - target: constants.MaxUint256, - currency: BigNumber.from(2) - .pow(8) - .sub(1), - duration: BigNumber.from(2) - .pow(16) - .sub(1), - discountRate: BigNumber.from(201), - fee: BigNumber.from(200), - metadata: constants.MaxUint256 - }, - setup: { - // No preconfiguration - preconfigure: null - }, - expectation: { - configuredNumber: 1, - configuredId: 1, - basedOn: 0 - } - }) - }, - { - description: - "ballot duration from current time is before preconfigured duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration shorter than the configuration duration. - duration: BigNumber.from(86300) - } - }, - // Fast forward to the time before when the ballot would equal the preconfigured duration. - fastforward: BigNumber.from(10), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: - "ballot duration from current time is preconfigured duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration shorter than the configuration duration. - duration: BigNumber.from(86390) - } - }, - // Fast forward to the time where the ballot would equal the preconfigured duration, - // which is the first second where the proposed configuration could start. - fastforward: BigNumber.from(9), - expectation: { - configuredNumber: 2, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "ballot duration just less than duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration shorter than the configuration duration. - duration: BigNumber.from(86399) - } - }, - // Fast forward to the second before the ballot duration expires. - fastforward: BigNumber.from(86398), - expectation: { - configuredNumber: 3, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "ballot duration same as funding cycle duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration to the same as the configuration duration. - duration: BigNumber.from(86400) - } - }, - // Fast forward to a seconds before the ballot duration expires. - fastforward: BigNumber.from(86399), - expectation: { - configuredNumber: 3, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "ballot duration just over the funding cycle duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration longer than the configuration duration. - duration: BigNumber.from(86401) - } - }, - // Fast forward to one seconds before the funding cycle expires. - fastforward: BigNumber.from(86400), - expectation: { - configuredNumber: 4, - configuredId: 2, - initId: 2, - basedOn: 1 - } - }) - }, - { - description: "override a pending reconfiguration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - ops: [ - // Add a reconfiguration to the same project. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(93), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false - } - ], - expectation: { - configuredNumber: 2, - configuredId: 2, - basedOn: 1 - } - }) - }, - { - description: "override a failed reconfiguration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration shorter than the configuration duration. - duration: BigNumber.from(86390) - } - }, - ops: [ - // Add a reconfiguration to the same project that will expire before the duration. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(3), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(93), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false - }, - { - type: "fastforward", - // Fast forward past the expired configuration. - seconds: BigNumber.from(86395) - }, - // Add another reconfiguration - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(4), - duration: BigNumber.from(2), - discountRate: BigNumber.from(93), - cycleLimit: BigNumber.from(0), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false - } - ], - // Fast forward a little bit more. - fastforward: BigNumber.from(10), - expectation: { - configuredNumber: 3, - configuredId: 2, - basedOn: 1 - } - }) - }, - { - description: "override a failed reconfiguration with a longer ballot", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1), - ballot: { - // Set the ballot duration shorter than the configuration duration. - duration: BigNumber.from(86397) - } - }, - ops: [ - // Add a reconfiguration to the same project that will expire before the duration. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(3), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(93), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false - }, - { - type: "fastforward", - // Fast forward past the expired configuration. - seconds: BigNumber.from(86395) - }, - // Add another reconfiguration - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(4), - duration: BigNumber.from(2), - discountRate: BigNumber.from(93), - cycleLimit: BigNumber.from(0), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false - } - ], - // Fast forward a little bit more. - fastforward: BigNumber.from(10), - expectation: { - configuredNumber: 4, - configuredId: 2, - basedOn: 1 - } - }) - }, - { - description: "within a cycle limit", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10), - ballot: { - state: 0 - } - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 1 - } - ], - // Fast forward to within the cycle. - fastforward: BigNumber.from(86400 * 11 - 1), - op: { - cycleLimit: 2 - }, - expectation: { - configuredNumber: 3, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "after a cycle limit", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(1) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(1), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 1 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 2 + 2), - expectation: { - configuredNumber: 4, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "cycle limit with a way different duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(4) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(1), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 1 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 5 + 1), - expectation: { - configuredNumber: 4, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "cycle limit with a way different duration, way later", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(4) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(1), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 1 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 9 + 1), - expectation: { - configuredNumber: 5, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "large cycle limit with a way different duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 5 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 20), - expectation: { - configuredNumber: 8, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: - "large cycle limit, many cycles later, with a way different duration", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 5 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 40), - expectation: { - configuredNumber: 10, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "Reconfigure with a cycle limit within another limit", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 5 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 40), - expectation: { - configuredNumber: 10, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "in the middle of a cycle limit", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10) - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 4 - } - ], - // Fast forward to the cycle after the limit expires. - fastforward: BigNumber.from(86400 * 13 + 1), - expectation: { - configuredNumber: 6, - configuredId: 3, - basedOn: 2 - } - }) - }, - { - description: "base on last good cycle if there ballot is active", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10), - ballot: { - state: 1 - } - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 0 - } - ], - // Fast forward to within the cycle. - fastforward: BigNumber.from(86400 * 11 - 2), - op: { - cycleLimit: 2 - }, - expectation: { - configuredNumber: 3, - configuredId: 3, - basedOn: 1 - } - }) - }, - { - description: "base on last good cycle if there ballot failed", - fn: testTemplate({ - preconfigure: { - // Preconfigure the duration. - duration: BigNumber.from(10), - ballot: { - state: 2 - } - }, - ops: [ - // Add a reconfiguration to the same project with a cycle limit. - { - type: "configure", - projectId: 1, - target: BigNumber.from(10), - currency: BigNumber.from(2), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(20), - fee: BigNumber.from(30), - metadata: BigNumber.from(5), - configureActiveFundingCycle: false, - ballot: { - duration: BigNumber.from(0) - }, - expectedCyclesUsed: 0 - } - ], - // Fast forward to within the cycle. - fastforward: BigNumber.from(86400 * 11 - 2), - op: { - cycleLimit: 2 - }, - expectation: { - configuredNumber: 3, - configuredId: 3, - basedOn: 1 - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: addrs[0].address, - setup: { preconfigure: null }, - revert: "TerminalUtility: UNAUTHORIZED", - // below values copied from the template - projectId: 1, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(80), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - configureActiveFundingCycle: false - }) - }, - { - description: "funding cycle limit is over 32", - fn: testTemplate({ - op: { - cycleLimit: 33 - }, - setup: { - // no preconfiguration - preconfigure: null - }, - revert: "FundingCycles::configure: BAD_CYCLE_LIMIT" - }) - }, - { - description: "duration more than the max allowed", - fn: testTemplate({ - op: { - duration: BigNumber.from(2).pow(16) - }, - setup: { - // no preconfiguration - preconfigure: null - }, - revert: "FundingCycles::configure: BAD_DURATION" - }) - }, - { - description: "discount rate over limit", - fn: testTemplate({ - op: { - discountRate: BigNumber.from(202) - }, - setup: { - // no preconfiguration - preconfigure: null - }, - revert: "FundingCycles::configure: BAD_DISCOUNT_RATE" - }) - }, - { - description: "currency over max allowed", - fn: testTemplate({ - op: { - currency: BigNumber.from(2).pow(8) - }, - setup: { - // no preconfiguration - preconfigure: null - }, - revert: "FundingCycles::configure: BAD_CURRENCY" - }) - }, - { - description: "fee over 100%", - fn: testTemplate({ - op: { - fee: BigNumber.from(201) - }, - setup: { - // no preconfiguration - preconfigure: null - }, - revert: "FundingCycles::configure: BAD_FEE" - }) - }, - { - description: "non recurring", - fn: testTemplate({ - preconfigure: { - discountRate: BigNumber.from(201) - }, - revert: "FundingCycles::_configurable: NON_RECURRING" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - target, - currency, - duration, - cycleLimit, - discountRate, - fee, - metadata, - configureActiveFundingCycle, - setup: { preconfigure, ops = [] } = {}, - expectation - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - let preconfigureBlockNumber; - - if (preconfigure) { - // If a ballot was provided, mock the ballot contract with the provided properties. - await this.ballot.mock.duration.returns(preconfigure.ballot.duration); - - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: preconfigure.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - preconfigureBlockNumber = tx.blockNumber; - - if (preconfigure.ballot.duration !== undefined) - await this.ballot.mock.duration.returns( - preconfigure.ballot.duration - ); - - if (preconfigure.ballot.state !== undefined) - await this.ballot.mock.state.returns(preconfigure.ballot.state); - - await this.setTimeMarkFn(tx.blockNumber); - } - - // Get a reference to the timestamp right after the preconfiguration occurs. - const expectedPreconfigureStart = await this.getTimestampFn( - preconfigureBlockNumber - ); - - const discountRatesToApply = []; - const durationsToApply = []; - - // Do any other specified operations. - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "configure": { - // eslint-disable-next-line no-await-in-loop - await this.contract.connect(caller).configure( - op.projectId, - { - target: op.target, - currency: op.currency, - duration: op.duration, - cycleLimit: op.cycleLimit, - discountRate: op.discountRate, - ballot: this.ballot.address - }, - op.metadata, - op.fee, - op.configureActiveFundingCycle - ); - - if (op.ballot) - // eslint-disable-next-line no-await-in-loop - await this.ballot.mock.duration.returns(op.ballot.duration); - - if (op.expectedCyclesUsed) { - for (let j = 0; j < op.expectedCyclesUsed; j += 1) { - discountRatesToApply.push(op.discountRate); - durationsToApply.push(op.duration); - } - } - break; - } - case "fastforward": - // Fast forward the clock if needed. - // Subtract 1 so that the next operations mined block is likely to fall on the intended timestamp. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds.sub(1)); - break; - default: - break; - } - } - - // Execute the transaction. - const tx = await this.contract.connect(caller).configure( - projectId, - { - target, - currency, - duration, - cycleLimit, - discountRate, - ballot: this.ballot.address - }, - metadata, - fee, - configureActiveFundingCycle - ); - - // Get the current timestamp after the transaction. - const now = await this.getTimestampFn(tx.blockNumber); - - // Expect two events to have been emitted. - await expect(tx) - .to.emit(this.contract, "Configure") - .withArgs( - expectation.configuredId, - projectId, - now, - [ - target, - currency, - duration, - cycleLimit, - discountRate, - this.ballot.address - ], - metadata, - caller.address - ); - - // Get a reference to the base weight. - const baseWeight = await this.contract.BASE_WEIGHT(); - - let expectedWeight = baseWeight; - - // Multiply the discount the amount of times specified. - for ( - let i = 0; - i < expectation.configuredNumber - 1 - discountRatesToApply.length; - i += 1 - ) { - expectedWeight = expectedWeight - .mul(BigNumber.from(1000).sub(preconfigure.discountRate)) - .div(1000); - } - for (let i = 0; i < discountRatesToApply.length; i += 1) { - expectedWeight = expectedWeight - .mul(BigNumber.from(1000).sub(discountRatesToApply[i])) - .div(1000); - } - - // Get the time when the configured funding cycle starts. - let expectedStart; - if (preconfigure && preconfigure.duration > 0) { - expectedStart = expectedPreconfigureStart.add( - preconfigure.duration - .mul(86400) - .mul(expectation.configuredNumber - 1 - durationsToApply.length) - ); - for (let i = 0; i < durationsToApply.length; i += 1) { - expectedStart = expectedStart.add(durationsToApply[i].mul(86400)); - } - } else { - expectedStart = now; - } - - // Expect an Init event if not configuring the same funding cycle again. - if (expectation.initId) { - await expect(tx) - .to.emit(this.contract, "Init") - .withArgs( - expectation.configuredId, - projectId, - expectation.configuredNumber, - expectation.basedOn, - expectedWeight, - expectedStart - ); - } - - // Get a reference to the funding cycle that was stored. - const storedFundingCycle = await this.contract.get( - expectation.configuredId - ); - - // Expect the stored values to match what's expected. - expect(storedFundingCycle.id).to.equal(expectation.configuredId); - expect(storedFundingCycle.projectId).to.equal(projectId); - expect(storedFundingCycle.number).to.equal( - expectation.configuredNumber - ); - expect(storedFundingCycle.basedOn).to.equal(expectation.basedOn); - expect(storedFundingCycle.weight).to.equal(expectedWeight); - expect(storedFundingCycle.ballot).to.equal(this.ballot.address); - expect(storedFundingCycle.start).to.equal(expectedStart); - expect(storedFundingCycle.configured).to.equal(now); - expect(storedFundingCycle.cycleLimit).to.equal(cycleLimit); - expect(storedFundingCycle.duration).to.equal(duration); - expect(storedFundingCycle.target).to.equal(target); - expect(storedFundingCycle.currency).to.equal(currency); - expect(storedFundingCycle.fee).to.equal(fee); - expect(storedFundingCycle.discountRate).to.equal(discountRate); - expect(storedFundingCycle.tapped).to.equal(0); - expect(storedFundingCycle.metadata).to.equal(metadata); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectId, - target, - currency, - duration, - cycleLimit, - discountRate, - fee, - metadata, - configureActiveFundingCycle, - setup: { preconfigure } = {}, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (preconfigure) { - await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: preconfigure.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - } - - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - await expect( - this.contract.connect(caller).configure( - projectId, - { - target, - currency, - duration, - cycleLimit, - discountRate, - ballot: this.ballot.address - }, - metadata, - fee, - configureActiveFundingCycle - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_ballot_state_of.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_ballot_state_of.js deleted file mode 100644 index 7db3525e2b..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_ballot_state_of.js +++ /dev/null @@ -1,651 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -/** - These tests rely on time manipulation quite a bit, which as far as i understand is hard to do precisely. - Ideally, the tests could mock the block.timestamp to preset numbers, but instead - they rely on 'fastforwarding' the time between operations. Fastforwarding creates a - high probability that the subsequent operation will fall on a block with the intended timestamp, - but there's a small chance that there's an off-by-one error. - - If anyone has ideas on how to mitigate this, please let me know. -*/ - -const testTemplate = ({ - set, - setup = {}, - preconfigure = {}, - fastforward, - ops = [], - expectation = {}, - revert -}) => ({ deployer, ballot }) => ({ - caller: deployer, - projectId: BigNumber.from(1), - setup: { - preconfigure: { - target: BigNumber.from(240), - currency: BigNumber.from(0), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(120), - fee: BigNumber.from(40), - metadata: BigNumber.from(3), - configureActiveFundingCycle: false, - ...preconfigure, - ballot: { - address: ballot.address, - duration: BigNumber.from(0), - ...preconfigure.ballot - } - }, - set, - ops: [ - ...ops, - ...(fastforward - ? [ - { - type: "fastforward", - seconds: fastforward - } - ] - : []) - ], - ...setup - }, - expectation, - revert -}); - -const tests = { - success: [ - { - description: "first funding cycle", - fn: testTemplate({ - expectation: { - state: 3 - } - }) - }, - { - description: "during first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - fastforward: BigNumber.from(6398), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "at the end of first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86393), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "immediately at the start of the second funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "immediately after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86401), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "shortly after the first funding cycle, approved ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "many cycles after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400 * 4), - expectation: { - // Should have the state of the last configured ballot. - state: 0 - } - }) - }, - { - description: "during first funding cycle, configuring the active cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: true, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86398), - expectation: { - // standby. - state: 3 - } - }) - }, - { - description: - "immediately after the first funding cycle, ignoring the option to configure the active one", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1), - configureActiveFundingCycle: true - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - set: 1, - expectation: { - fundingCycleId: 2, - state: 1 - } - }) - }, - { - description: "first funding cycle, max values", - fn: testTemplate({ - preconfigure: { - target: constants.MaxUint256, - currency: BigNumber.from(2) - .pow(8) - .sub(1), - duration: BigNumber.from(2) - .pow(16) - .sub(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(201), - fee: BigNumber.from(200), - metadata: constants.MaxUint256 - }, - fastforward: BigNumber.from(80), - expectation: { - state: 3 - } - }) - }, - { - description: "adding other projects' funding cycles throughout", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1234, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - }, - { - type: "fastforward", - seconds: BigNumber.from(86390) - }, - // Add another configuration for a different project. - { - type: "configure", - projectId: 2345, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(1), - expectation: { - state: 3 - } - }) - }, - { - description: "first configuration, with an active ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(1) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - state: 1 - } - }) - }, - { - description: "first configuration, with a failed ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(2) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - state: 2 - } - }) - }, - { - description: "first configuration, with a standby ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(3) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - state: 3 - } - }) - } - ], - failure: [ - { - description: "project not found", - fn: testTemplate({ - setup: { - // No preconfigure - preconfigure: null - }, - revert: "FundingCycles::currentBallotStateOf: NOT_FOUND" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - setup: { preconfigure, set, ops = [] } = {}, - expectation - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (preconfigure) { - // If a ballot was provided, mock the ballot contract with the provided properties. - await this.ballot.mock.duration.returns(preconfigure.ballot.duration); - - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: this.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - - await this.setTimeMarkFn(tx.blockNumber); - } - - // Do any other specified operations. - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "configure": { - // Mock the project's controller status if needed. - if (op.projectId !== projectId) { - // Mock the caller to be the project's controller. - // eslint-disable-next-line no-await-in-loop - await this.terminalDirectory.mock.terminalOf - .withArgs(op.projectId) - .returns(caller.address); - } - // eslint-disable-next-line no-await-in-loop - const tx = await this.contract.connect(caller).configure( - op.projectId, - { - target: op.target, - currency: op.currency, - duration: op.duration, - cycleLimit: op.cycleLimit, - discountRate: op.discountRate, - ballot: this.ballot.address - }, - op.metadata, - op.fee, - op.configureActiveFundingCycle - ); - if (op.ballot) { - // eslint-disable-next-line no-await-in-loop - await this.ballot.mock.state - .withArgs( - op.ballot.fundingCycleId, - // eslint-disable-next-line no-await-in-loop - await this.getTimestampFn(tx.blockNumber) - ) - .returns(op.ballot.state); - } - - break; - } - case "fastforward": { - // Fast forward the clock if needed. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds); - break; - } - default: - break; - } - } - - const storedQueued = await this.contract.queuedOf(projectId); - - if (expectation.fundingCycleId) { - await this.ballot.mock.state - .withArgs(expectation.fundingCycleId, storedQueued.configured) - .returns(set); - } - - // Execute the transaction. - const storedCurrentBallotState = await this.contract.currentBallotStateOf( - projectId - ); - - // Expect the stored values to match what's expected. - expect(storedCurrentBallotState).to.equal(expectation.state); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, projectId, revert } = failureTest.fn(this); - await expect( - this.contract.connect(caller).currentBallotStateOf(projectId) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_of.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_of.js deleted file mode 100644 index f8dd37fc68..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/current_of.js +++ /dev/null @@ -1,757 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -/** - These tests rely on time manipulation quite a bit, which as far as i understand is hard to do precisely. - Ideally, the tests could mock the block.timestamp to preset numbers, but instead - they rely on 'fastforwarding' the time between operations. Fastforwarding creates a - high probability that the subsequent operation will fall on a block with the intended timestamp, - but there's a small chance that there's an off-by-one error. - - If anyone has ideas on how to mitigate this, please let me know. -*/ - -const testTemplate = ({ - op = {}, - setup = {}, - preconfigure = {}, - fastforward, - ops = [], - expectation = {}, - revert -}) => ({ deployer, ballot }) => ({ - caller: deployer, - projectId: 1, - setup: { - preconfigure: { - target: BigNumber.from(240), - currency: BigNumber.from(0), - duration: BigNumber.from(100), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(120), - fee: BigNumber.from(40), - metadata: BigNumber.from(3), - configureActiveFundingCycle: false, - ...preconfigure, - ballot: { - address: ballot.address, - duration: BigNumber.from(0), - ...preconfigure.ballot - } - }, - ops: [ - ...ops, - ...(fastforward - ? [ - { - type: "fastforward", - seconds: fastforward - } - ] - : []) - ], - ...setup - }, - expectation, - ...op, - revert -}); - -const tests = { - success: [ - { - description: "first funding cycle", - fn: testTemplate({ - expectation: { - id: 1, - number: 1 - } - }) - }, - { - description: "during first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - fastforward: BigNumber.from(86398), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "at the end of first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(2), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86398), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "immediately at the start of the second funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "immediately after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86401), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "shortly after the first funding cycle, approved ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "many cycles after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400 * 4 - 1), - expectation: { - number: 4, - id: 0 - } - }) - }, - { - description: "during first funding cycle, configuring the active cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: true, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86399), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: - "immediately after the first funding cycle, ignoring the option to configure the active one", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1), - configureActiveFundingCycle: true - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "first funding cycle, max values", - fn: testTemplate({ - preconfigure: { - target: constants.MaxUint256, - currency: BigNumber.from(2) - .pow(8) - .sub(1), - duration: BigNumber.from(2) - .pow(16) - .sub(1), - discountRate: BigNumber.from(201), - fee: BigNumber.from(200), - metadata: constants.MaxUint256 - }, - fastforward: BigNumber.from(80), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "adding other projects' funding cycles throughout", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1234, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - }, - { - type: "fastforward", - seconds: BigNumber.from(86300) - }, - // Add another configuration for a different project. - { - type: "configure", - projectId: 2345, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(10), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "first configuration, with an active ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(1) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - number: 2, - id: 0 - } - }) - }, - { - description: "first configuration, with a failed ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(2) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - number: 2, - id: 0 - } - }) - }, - { - description: "first configuration, with a standby ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(3) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(96401), - expectation: { - number: 2, - id: 0 - } - }) - }, - { - description: "with a cycle limit", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - cycleLimit: BigNumber.from(5), - duration: BigNumber.from(1), - // The below values dont matter. - currency: BigNumber.from(1), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86400 * 11 + 1), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "after a cycle limit", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - cycleLimit: BigNumber.from(5), - duration: BigNumber.from(1), - // The below values dont matter. - currency: BigNumber.from(1), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86400 * 17 - 1), - expectation: { - number: 7, - id: 0 - } - }) - }, - { - description: "first configuration, non recurring", - fn: testTemplate({ - preconfigure: { - target: BigNumber.from(140), - discountRate: BigNumber.from(201) - }, - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "project not found", - fn: testTemplate({ - setup: { - // No preconfigure - preconfigure: null - }, - expectation: { - number: 0, - id: 0 - } - }) - }, - { - description: "with duration of 0, right away", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(0) - }, - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "with duration of 0", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(0) - }, - fastforward: BigNumber.from(1234567), - expectation: { - number: 1, - id: 1 - } - }) - }, - { - description: "non recurring", - fn: testTemplate({ - preconfigure: { - discountRate: BigNumber.from(201), - duration: BigNumber.from(1) - }, - fastforward: BigNumber.from(86401), - expectation: { - number: 0, - id: 0 - } - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - setup: { preconfigure, ops = [] } = {}, - expectation - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (preconfigure) { - // If a ballot was provided, mock the ballot contract with the provided properties. - await this.ballot.mock.duration.returns(preconfigure.ballot.duration); - - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: this.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - - await this.setTimeMarkFn(tx.blockNumber); - } - - // Mock the duration as 0. - await this.ballot.mock.duration.returns(BigNumber.from(0)); - - // Do any other specified operations. - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "configure": { - if (op.projectId !== projectId) { - // Mock the caller to be the project's controller. - // eslint-disable-next-line no-await-in-loop - await this.terminalDirectory.mock.terminalOf - .withArgs(op.projectId) - .returns(caller.address); - } - // eslint-disable-next-line no-await-in-loop - const tx = await this.contract.connect(caller).configure( - op.projectId, - { - target: op.target, - currency: op.currency, - duration: op.duration, - cycleLimit: op.cycleLimit, - discountRate: op.discountRate, - ballot: this.ballot.address - }, - op.metadata, - op.fee, - op.configureActiveFundingCycle - ); - if (op.ballot) { - // eslint-disable-next-line no-await-in-loop - await this.ballot.mock.state - .withArgs( - op.ballot.fundingCycleId, - // eslint-disable-next-line no-await-in-loop - await this.getTimestampFn(tx.blockNumber) - ) - .returns(op.ballot.state); - } - - break; - } - case "fastforward": { - // Fast forward the clock if needed. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds); - break; - } - default: - break; - } - } - - // Execute the transaction. - const storedCurrentFundingCycle = await this.contract.currentOf( - projectId - ); - - // Expect the stored values to match what's expected. - expect(storedCurrentFundingCycle.id).to.equal(expectation.id); - expect(storedCurrentFundingCycle.number).to.equal(expectation.number); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/index.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/index.js deleted file mode 100644 index dd24b4ea7e..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const configure = require("./configure"); -const tap = require("./tap"); -const currentOf = require("./current_of"); -const queuedOf = require("./queued_of"); -const currentBallotStateOf = require("./current_ballot_state_of"); - -module.exports = { - configure, - tap, - currentOf, - queuedOf, - currentBallotStateOf -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/queued_of.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/queued_of.js deleted file mode 100644 index d740de7b81..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/queued_of.js +++ /dev/null @@ -1,746 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -/** - These tests rely on time manipulation quite a bit, which as far as i understand is hard to do precisely. - Ideally, the tests could mock the block.timestamp to preset numbers, but instead - they rely on 'fastforwarding' the time between operations. Fastforwarding creates a - high probability that the subsequent operation will fall on a block with the intended timestamp, - but there's a small chance that there's an off-by-one error. - - If anyone has ideas on how to mitigate this, please let me know. -*/ - -const testTemplate = ({ - op = {}, - setup = {}, - preconfigure = {}, - fastforward, - ops = [], - expectation = {}, - revert -}) => ({ deployer, ballot }) => ({ - caller: deployer, - projectId: 1, - setup: { - preconfigure: { - target: BigNumber.from(240), - currency: BigNumber.from(0), - duration: BigNumber.from(100), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(120), - fee: BigNumber.from(40), - metadata: BigNumber.from(3), - configureActiveFundingCycle: false, - ...preconfigure, - ballot: { - address: ballot.address, - duration: BigNumber.from(0), - ...preconfigure.ballot - } - }, - ops: [ - ...ops, - ...(fastforward - ? [ - { - type: "fastforward", - seconds: fastforward - } - ] - : []) - ], - ...setup - }, - expectation, - ...op, - revert -}); - -const tests = { - success: [ - { - description: "first funding cycle", - fn: testTemplate({ - expectation: { - id: 0, - number: 2 - } - }) - }, - { - description: "during first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - fastforward: BigNumber.from(86390), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "at the end of first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86398), - expectation: { - number: 2, - id: 2 - } - }) - }, - { - description: "immediately at the start of the second funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "immediately after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86401), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "shortly after the first funding cycle, approved ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "many cycles after the first funding cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400 * 4 - 1), - expectation: { - number: 5, - id: 0 - } - }) - }, - { - description: "during first funding cycle, configuring the active cycle", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: true, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86398), - expectation: { - number: 2, - id: 0 - } - }) - }, - { - description: - "immediately after the first funding cycle, ignoring the option to configure the active one", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1), - configureActiveFundingCycle: true - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // The below properties don't affect this test. - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(86400), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "first funding cycle, max values", - fn: testTemplate({ - preconfigure: { - target: constants.MaxUint256, - currency: BigNumber.from(2) - .pow(8) - .sub(1), - duration: BigNumber.from(2) - .pow(16) - .sub(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(201), - fee: BigNumber.from(200), - metadata: constants.MaxUint256 - }, - fastforward: BigNumber.from(80), - expectation: { - number: 0, // Expect 0 because its non recurring. - id: 0 - } - }) - }, - { - description: "adding other projects' funding cycles throughout", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1234, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - }, - { - type: "fastforward", - seconds: BigNumber.from(86390) - }, - // Add another configuration for a different project. - { - type: "configure", - projectId: 2345, - // The below properties don't affect this test. - configureActiveFundingCycle: false, - target: BigNumber.from(120), - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - ballot: { - // Active - state: BigNumber.from(0), - fundingCycleId: 2 - } - } - ], - fastforward: BigNumber.from(1), - expectation: { - number: 2, - id: 0 - } - }) - }, - { - description: "first configuration, with an active ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(1) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "first configuration, with a failed ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(2) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "first configuration, with a standby ballot", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(3) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - number: 3, - id: 0 - } - }) - }, - { - description: "with a cycle limit", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - cycleLimit: BigNumber.from(5), - duration: BigNumber.from(1), - // The below values dont matter. - currency: BigNumber.from(1), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86400 * 11 + 1), - expectation: { - number: 4, - id: 0 - } - }) - }, - { - description: "after a cycle limit", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - cycleLimit: BigNumber.from(5), - duration: BigNumber.from(1), - // The below values dont matter. - currency: BigNumber.from(1), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86400 * 17 + 10), - expectation: { - number: 8, - id: 0 - } - }) - }, - { - description: "duration of 0, right away", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(0) - }, - expectation: { - number: 0, - id: 0 - } - }) - }, - { - description: "duration of 0, a while later", - fn: testTemplate({ - preconfigure: { - duration: BigNumber.from(0) - }, - fastforward: BigNumber.from(12345567), - expectation: { - number: 0, - id: 0 - } - }) - }, - { - description: "project not found", - fn: testTemplate({ - setup: { - // No preconfigure - preconfigure: null - }, - expectation: { - number: 0, - id: 0 - } - }) - }, - { - description: "non recurring", - fn: testTemplate({ - preconfigure: { - discountRate: BigNumber.from(201), - duration: BigNumber.from(1) - }, - fastforward: BigNumber.from(86401), - expectation: { - number: 0, - id: 0 - } - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - setup: { preconfigure, ops = [] } = {}, - expectation - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (preconfigure) { - // If a ballot was provided, mock the ballot contract with the provided properties. - await this.ballot.mock.duration.returns(preconfigure.ballot.duration); - - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: this.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - - await this.setTimeMarkFn(tx.blockNumber); - } - - // Mock the duration as 0. - await this.ballot.mock.duration.returns(BigNumber.from(0)); - - // Do any other specified operations. - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "configure": { - if (op.projectId !== projectId) { - // Mock the caller to be the project's controller. - // eslint-disable-next-line no-await-in-loop - await this.terminalDirectory.mock.terminalOf - .withArgs(op.projectId) - .returns(caller.address); - } - // eslint-disable-next-line no-await-in-loop - const tx = await this.contract.connect(caller).configure( - op.projectId, - { - target: op.target, - currency: op.currency, - duration: op.duration, - cycleLimit: op.cycleLimit, - discountRate: op.discountRate, - ballot: this.ballot.address - }, - op.metadata, - op.fee, - op.configureActiveFundingCycle - ); - if (op.ballot) { - // eslint-disable-next-line no-await-in-loop - await this.ballot.mock.state - .withArgs( - op.ballot.fundingCycleId, - // eslint-disable-next-line no-await-in-loop - await this.getTimestampFn(tx.blockNumber) - ) - .returns(op.ballot.state); - } - - break; - } - case "fastforward": { - // Fast forward the clock if needed. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds); - break; - } - default: - break; - } - } - - // Execute the transaction. - const storedQueuedFundingCycle = await this.contract.queuedOf( - projectId - ); - - // Expect the stored values to match what's expected. - expect(storedQueuedFundingCycle.id).to.equal(expectation.id); - expect(storedQueuedFundingCycle.number).to.equal(expectation.number); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/tap.js b/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/tap.js deleted file mode 100644 index d250bee03e..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/behaviors/tap.js +++ /dev/null @@ -1,1043 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -/** - These tests rely on time manipulation quite a bit, which as far as i understand is hard to do precisely. - Ideally, the tests could mock the block.timestamp to preset numbers, but instead - they rely on 'fastforwarding' the time between operations. Fastforwarding creates a - high probability that the subsequent operation will fall on a block with the intended timestamp, - but there's a small chance that there's an off-by-one error. - - If anyone has ideas on how to mitigate this, please let me know. -*/ - -const testTemplate = ({ - op = {}, - setup = {}, - preconfigure = {}, - fastforward, - ops = [], - expectation = {}, - revert -}) => ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - amount: BigNumber.from(20), - setup: { - preconfigure: { - target: BigNumber.from(240), - currency: BigNumber.from(0), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(120), - fee: BigNumber.from(40), - metadata: BigNumber.from(3), - configureActiveFundingCycle: false, - ...preconfigure - }, - ops: [ - ...ops, - ...(fastforward - ? [ - { - type: "fastforward", - seconds: fastforward - } - ] - : []) - ], - ...setup - }, - expectation, - ...op, - revert -}); -const tests = { - success: [ - { - description: "first configuration, partial amount", - fn: testTemplate({ - op: { - // Amount is a part of the target. - amount: BigNumber.from(20) - }, - preconfigure: { - // Greater than the amount. - target: BigNumber.from(120) - }, - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(20) - } - }) - }, - { - description: "first configuration, full amount", - fn: testTemplate({ - op: { - // Amount is equal to the target. - amount: BigNumber.from(120) - }, - preconfigure: { - // Equal to the amount. - target: BigNumber.from(120) - }, - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "second overriding configuration", - fn: testTemplate({ - op: { - // Bigger than the preconfiguration, less than the second configuration. - amount: BigNumber.from(140) - }, - preconfigure: { - // Less than the amount being tapped. Should be overwritten. - target: BigNumber.from(120) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: true, - // Greater than the amount being tapped. - target: BigNumber.from(150), - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(140) - } - }) - }, - { - description: "first configuration, with a standby cycle", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(120) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped since this configuration shouldnt be tapped. - target: BigNumber.from(50), - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "second configuration, with approved ballot", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Less than the amount being tapped. Should be ignored. - target: BigNumber.from(100), - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Greater than the amount being tapped. - target: BigNumber.from(120), - cycleLimit: BigNumber.from(0), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward the full duration. - fastforward: BigNumber.from(86400), - expectation: { - tappedId: 2, - tappedNumber: 2, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "first configuration, with an active ballot", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(1) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - tappedId: 3, - tappedNumber: 2, - initNumber: 2, - basedOn: 1, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "first configuration, with a failed ballot", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(2) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - tappedId: 3, - tappedNumber: 2, - initNumber: 2, - basedOn: 1, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "first configuration, with a standby ballot", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(1) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is not yet approved. - fundingCycleId: 2, - state: BigNumber.from(3) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(0), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92) - } - ], - // Fast forward past the full duration. - fastforward: BigNumber.from(86401), - expectation: { - tappedId: 3, - tappedNumber: 2, - initNumber: 2, - basedOn: 1, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "first configuration, a while later", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(1) - }, - // Fast forward multiples of the duration. - fastforward: BigNumber.from(86400 * 3 + 1), - expectation: { - tappedId: 2, - tappedNumber: 4, - initNumber: 4, - basedOn: 1, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "first configuration, twice", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140) - }, - ops: [ - { - projectId: 1, - type: "tap", - // A partial amount. - amount: BigNumber.from(20) - } - ], - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(140) - } - }) - }, - { - description: "first configuration, non recurring", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(20), - discountRate: BigNumber.from(201) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140) - }, - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: BigNumber.from(20) - } - }) - }, - { - description: "taps, first configuration, max uints", - fn: testTemplate({ - op: { - amount: constants.MaxUint256 - }, - preconfigure: { - target: constants.MaxUint256 - }, - expectation: { - tappedId: 1, - tappedNumber: 1, - initNumber: 1, - basedOn: 0, - newTappedAmount: constants.MaxUint256 - } - }) - }, - { - description: "during cycle limit", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the cycle limit. - amount: BigNumber.from(100) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 1 - } - ], - // Fast forward past the cycle limits. - fastforward: BigNumber.from(86400 * 11 + 1), - expectation: { - tappedId: 3, - tappedNumber: 3, - initNumber: 3, - basedOn: 2, - newTappedAmount: BigNumber.from(100) - } - }) - }, - { - description: "during last cycle of cycle limit", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the cycle limit. - amount: BigNumber.from(100) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 4 - } - ], - // Fast forward past the cycle limits. - fastforward: BigNumber.from(86400 * 14 + 1), - expectation: { - tappedId: 3, - tappedNumber: 6, - initNumber: 6, - basedOn: 2, - newTappedAmount: BigNumber.from(100) - } - }) - }, - { - description: "after cycle limit", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the cycle limit. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 5 - } - ], - // Fast forward past the cycle limits. - fastforward: BigNumber.from(86400 * 15 + 1), - expectation: { - tappedId: 3, - tappedNumber: 7, - initNumber: 7, - basedOn: 2, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "a while after cycle limit", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the cycle limit. - amount: BigNumber.from(120) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 5 - } - ], - // Fast forward past the cycle limits. - fastforward: BigNumber.from(86400 * 35 + 1), - expectation: { - tappedId: 3, - tappedNumber: 9, - initNumber: 9, - basedOn: 2, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "with second cycle limit during first", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the cycle limit. - amount: BigNumber.from(200) - }, - preconfigure: { - // Greater than the amount being tapped. - target: BigNumber.from(140), - duration: BigNumber.from(10) - }, - ops: [ - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(100), - ballot: { - // This funding cycle (2) is approved. - fundingCycleId: 2, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(1), - cycleLimit: BigNumber.from(5), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 1 - }, - { - type: "fastforward", - seconds: BigNumber.from(86400 * 11 + 1) - }, - { - type: "configure", - projectId: 1, - configureActiveFundingCycle: false, - // Less than the amount being tapped. Should be ignored - target: BigNumber.from(200), - ballot: { - // This funding cycle (3) is approved. - fundingCycleId: 3, - state: BigNumber.from(0) - }, - // The below values dont matter. - currency: BigNumber.from(1), - duration: BigNumber.from(2), - cycleLimit: BigNumber.from(4), - discountRate: BigNumber.from(180), - fee: BigNumber.from(42), - metadata: BigNumber.from(92), - expectedCyclesUsed: 0 - } - ], - // Fast forward past the cycle limits. - fastforward: BigNumber.from(86401), - expectation: { - tappedId: 3, - tappedNumber: 4, - newTappedAmount: BigNumber.from(200) - } - }) - }, - { - description: "with duration of zero, right away", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // At least the amount being tapped. Should be ignored. - target: BigNumber.from(120), - duration: BigNumber.from(0) - }, - expectation: { - tappedId: 1, - tappedNumber: 1, - newTappedAmount: BigNumber.from(120) - } - }) - }, - { - description: "with duration of zero, a while later", - fn: testTemplate({ - op: { - // Less than the preconfiguration, greater than the standby. - amount: BigNumber.from(120) - }, - preconfigure: { - // At least the amount being tapped. Should be ignored. - target: BigNumber.from(120), - duration: BigNumber.from(0) - }, - // Fast forward the full duration. - fastforward: BigNumber.from(12345678), - expectation: { - tappedId: 1, - tappedNumber: 1, - newTappedAmount: BigNumber.from(120) - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: addrs[0].address, - setup: { preconfigure: null }, - revert: "TerminalUtility: UNAUTHORIZED", - // below values copied from template - projectId: 1, - amount: BigNumber.from(20) - }) - }, - { - description: "project not found", - fn: testTemplate({ - setup: { - // No preconfigure - preconfigure: null - }, - revert: "FundingCycles::_tappable: NOT_FOUND" - }) - }, - { - description: "non recurring", - fn: testTemplate({ - preconfigure: { - discountRate: BigNumber.from(201), - duration: BigNumber.from(1) - }, - fastforward: BigNumber.from(86401), - revert: "FundingCycles::_tappable: NON_RECURRING" - }) - }, - { - description: "insufficient funds, first tap", - fn: testTemplate({ - op: { - // More than the target. - amount: BigNumber.from(120) - }, - preconfigure: { - target: BigNumber.from(100) - }, - revert: "FundingCycles::tap: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, subsequent tap", - fn: testTemplate({ - op: { - // More than the target when added to what's already tapped. - amount: BigNumber.from(101), - projectId: 1 - }, - preconfigure: { - projectId: 1, - target: BigNumber.from(100) - }, - ops: [ - { - type: "tap", - projectId: 1, - amount: BigNumber.from(20) - } - ], - revert: "FundingCycles::tap: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - amount, - setup: { preconfigure, ops = [] }, - expectation - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - let preconfigureBlockNumber; - - if (preconfigure) { - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: this.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - preconfigureBlockNumber = tx.blockNumber; - await this.setTimeMarkFn(tx.blockNumber); - } - - // Get a reference to the timestamp right after the preconfiguration occurs. - const expectedPreconfigureStart = await this.getTimestampFn( - preconfigureBlockNumber - ); - - // Mock the duration as 0. - await this.ballot.mock.duration.returns(BigNumber.from(0)); - - const discountRatesToApply = []; - const durationsToApply = []; - - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "configure": { - // eslint-disable-next-line no-await-in-loop - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: op.target, - currency: op.currency, - duration: op.duration, - cycleLimit: op.cycleLimit, - discountRate: op.discountRate, - ballot: this.ballot.address - }, - op.metadata, - op.fee, - op.configureActiveFundingCycle - ); - - // Mock the ballot state for this reconfiguration if needed. - if (op.ballot) { - // eslint-disable-next-line no-await-in-loop - await this.ballot.mock.state - .withArgs( - op.ballot.fundingCycleId, - // eslint-disable-next-line no-await-in-loop - await this.getTimestampFn(tx.blockNumber) - ) - .returns(op.ballot.state); - } - - if (op.expectedCyclesUsed) { - for (let j = 0; j < op.expectedCyclesUsed; j += 1) { - discountRatesToApply.push(op.discountRate); - durationsToApply.push(op.duration); - } - } - - break; - } - case "tap": - // eslint-disable-next-line no-await-in-loop - await this.contract.connect(caller).tap(op.projectId, op.amount); - break; - case "fastforward": - // Subtract 1 so that the next operations mined block is likely to fall on the intended timestamp. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds.sub(1)); - break; - default: - break; - } - } - - const tx = await this.contract.connect(caller).tap(projectId, amount); - - // Get the current timestamp after the transaction. - const now = await this.getTimestampFn(tx.blockNumber); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Tap") - .withArgs( - expectation.tappedId, - projectId, - amount, - expectation.newTappedAmount, - caller.address - ); - - // Expect an Init event if not configuring the same funding cycle again. - if (expectation.initNumber > 1) { - // Get a reference to the base weight. - const baseWeight = await this.contract.BASE_WEIGHT(); - - let expectedWeight = baseWeight; - - // Multiply the discount the amount of times specified. - for ( - let i = 0; - i < expectation.initNumber - 1 - discountRatesToApply.length; - i += 1 - ) { - expectedWeight = expectedWeight - .mul(BigNumber.from(1000).sub(preconfigure.discountRate)) - .div(1000); - } - for (let i = 0; i < discountRatesToApply.length; i += 1) { - expectedWeight = expectedWeight - .mul(BigNumber.from(1000).sub(discountRatesToApply[i])) - .div(1000); - } - - // Get the time when the configured funding cycle starts. - let expectedStart; - if (preconfigure) { - expectedStart = expectedPreconfigureStart.add( - preconfigure.duration - .mul(86400) - .mul(expectation.initNumber - 1 - durationsToApply.length) - ); - for (let i = 0; i < durationsToApply.length; i += 1) { - expectedStart = expectedStart.add(durationsToApply[i].mul(86400)); - } - } else { - expectedStart = now; - } - await expect(tx) - .to.emit(this.contract, "Init") - .withArgs( - expectation.tappedId, - projectId, - expectation.initNumber, - expectation.basedOn, - expectedWeight, - expectedStart - ); - } - - // Get a reference to the funding cycle that was tapped. - const tappedFundingCycle = await this.contract.get( - expectation.tappedId - ); - - // Expect the stored values to match what's expected. - expect(tappedFundingCycle.id).to.equal(expectation.tappedId); - expect(tappedFundingCycle.projectId).to.equal(projectId); - expect(tappedFundingCycle.number).to.equal( - expectation.tappedNumber || 1 - ); - expect(tappedFundingCycle.tapped).to.equal(expectation.newTappedAmount); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectId, - amount, - setup: { preconfigure, ops = [] }, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (preconfigure) { - const tx = await this.contract.connect(caller).configure( - projectId, - { - target: preconfigure.target, - currency: preconfigure.currency, - duration: preconfigure.duration, - cycleLimit: preconfigure.cycleLimit, - discountRate: preconfigure.discountRate, - ballot: this.ballot.address - }, - preconfigure.metadata, - preconfigure.fee, - preconfigure.configureActiveFundingCycle - ); - await this.setTimeMarkFn(tx.blockNumber); - } - - for (let i = 0; i < ops.length; i += 1) { - const op = ops[i]; - switch (op.type) { - case "tap": - // eslint-disable-next-line no-await-in-loop - await this.contract.connect(caller).tap(op.projectId, op.amount); - break; - case "fastforward": - // Subtract 1 so that the next operations mined block is likely to fall on the intended timestamp. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(op.seconds.sub(1)); - break; - default: - break; - } - } - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - await expect( - this.contract.connect(caller).tap(projectId, amount) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/funding_cycles/index.js b/packages/hardhat/test/unit/behaviors/funding_cycles/index.js deleted file mode 100644 index bf075bdcff..0000000000 --- a/packages/hardhat/test/unit/behaviors/funding_cycles/index.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - These tests rely on time manipulation quite a bit, which as far as i understand is hard to do precisely. - Ideally, the tests could mock the block.timestamp to preset numbers, but instead - they rely on 'fastforwarding' the time between operations. Fastforwarding creates a - high probability that the subsequent operation will fall on a block with the intended timestamp, - but there's a small chance that there's an off-by-one error. - - As a result, tests that depend on the exact time are flaky 10% of the time. - This is ok. There are tests for either side of the exact time that are included. - - If anyone has ideas on how to mitigate this, please let me know. - - NOTE: Considering removing these tests from the corpus all together. -*/ -process.env.INCLUDE_TIME_EDGE_CASE_TEST = false; - -const shouldBehaveLike = require("./behaviors"); - -const contractName = "FundingCycles"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - this.ballot = await this.deployMockLocalContractFn( - "Active14DaysFundingCycleBallot" - ); - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.terminalDirectory.address - ]); - }); - - // Test each function. - describe("configure(...)", shouldBehaveLike.configure); - describe("tap(...)", shouldBehaveLike.tap); - describe("currentOf(...)", shouldBehaveLike.currentOf); - describe("queuedOf(...)", shouldBehaveLike.queuedOf); - describe("currentBallotStateOf(...)", shouldBehaveLike.currentBallotStateOf); -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/behaviors/add_price_feed.js b/packages/hardhat/test/unit/behaviors/governance/behaviors/add_price_feed.js deleted file mode 100644 index 4d283b6048..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/behaviors/add_price_feed.js +++ /dev/null @@ -1,71 +0,0 @@ -const { expect } = require("chai"); -const AggregatorV3Interface = require("@chainlink/contracts/abi/v0.6/AggregatorV3Interface.json"); - -const tests = { - success: [ - { - description: "adds price feed", - fn: ({ deployer }) => ({ - caller: deployer - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller } = successTest.fn(this); - - const prices = await this.deployMockLocalContractFn("Prices"); - // Deploy a mock of the price feed oracle contract. - const priceFeed = await this.deployMockContractFn( - AggregatorV3Interface.compilerOutput.abi - ); - - const currency = 1; - - await prices.mock.addFeed - .withArgs(priceFeed.address, currency) - .returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .addPriceFeed(prices.address, priceFeed.address, currency); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, revert } = failureTest.fn(this); - - const prices = await this.deployMockLocalContractFn("Prices"); - // Deploy a mock of the price feed oracle contract. - const priceFeed = await this.deployMockContractFn( - AggregatorV3Interface.compilerOutput.abi - ); - - const currency = 1; - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .addPriceFeed(prices.address, priceFeed.address, currency) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/behaviors/allow_migration.js b/packages/hardhat/test/unit/behaviors/governance/behaviors/allow_migration.js deleted file mode 100644 index d453d22acd..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/behaviors/allow_migration.js +++ /dev/null @@ -1,138 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "allow migration", - fn: ({ deployer }) => ({ - caller: deployer - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const from = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - const to = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - await from.mock.allowMigration.withArgs(to.address).returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .allowMigration(from.address, to.address); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, revert } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const from = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - const to = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - // Execute the transaction. - await expect( - this.contract.connect(caller).allowMigration(from.address, to.address) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/behaviors/appoint_governance.js b/packages/hardhat/test/unit/behaviors/governance/behaviors/appoint_governance.js deleted file mode 100644 index bd164adf35..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/behaviors/appoint_governance.js +++ /dev/null @@ -1,126 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "appoints governance", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - newGovernance: addrs[0].address - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - newGovernance: addrs[0].address, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, newGovernance } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - await terminalV1.mock.appointGovernance - .withArgs(newGovernance) - .returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .appointGovernance(terminalV1.address, newGovernance); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, newGovernance, revert } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .appointGovernance(terminalV1.address, newGovernance) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/behaviors/index.js b/packages/hardhat/test/unit/behaviors/governance/behaviors/index.js deleted file mode 100644 index bb5a369cd1..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/behaviors/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const allowMigration = require("./allow_migration"); -const addPriceFeed = require("./add_price_feed"); -const setFee = require("./set_fee"); -const appointGovernance = require("./appoint_governance"); - -module.exports = { - allowMigration, - addPriceFeed, - setFee, - appointGovernance -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/behaviors/set_fee.js b/packages/hardhat/test/unit/behaviors/governance/behaviors/set_fee.js deleted file mode 100644 index 10418f8eaa..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/behaviors/set_fee.js +++ /dev/null @@ -1,120 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "sets fee", - fn: ({ deployer }) => ({ - caller: deployer - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - const fee = 1; - - await terminalV1.mock.setFee.withArgs(fee).returns(); - - // Execute the transaction. - await this.contract.connect(caller).setFee(terminalV1.address, fee); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, revert } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - const fee = 1; - - // Execute the transaction. - await expect( - this.contract.connect(caller).setFee(terminalV1.address, fee) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/governance/index.js b/packages/hardhat/test/unit/behaviors/governance/index.js deleted file mode 100644 index c2aeaa45a6..0000000000 --- a/packages/hardhat/test/unit/behaviors/governance/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "Governance"; - -module.exports = function() { - // Before the tests, deploy the contract. - before(async function() { - this.projectId = 1; - - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.projectId, - this.terminalDirectory.address - ]); - }); - - // Test each function. - describe("allowMigration(...)", shouldBehaveLike.allowMigration); - describe("addPriceFeed(...)", shouldBehaveLike.addPriceFeed); - describe("setFee(...)", shouldBehaveLike.setFee); - describe("appointGovernance(...)", shouldBehaveLike.appointGovernance); -}; diff --git a/packages/hardhat/test/unit/behaviors/index.js b/packages/hardhat/test/unit/behaviors/index.js deleted file mode 100644 index f1394b5b10..0000000000 --- a/packages/hardhat/test/unit/behaviors/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const operatorStore = require("./operator_store"); -const projects = require("./projects"); -const prices = require("./prices"); -const modStore = require("./mod_store"); -const ticketBooth = require("./ticket_booth"); -const fundingCycles = require("./funding_cycles"); -const directPaymentAddress = require("./direct_payment_address"); -const proxyPaymentAddress = require("./proxy_payment_address"); -const proxyPaymentAddressManager = require("./proxy_payment_address_manager"); -const terminalDirectory = require("./terminal_directory"); -const governance = require("./governance"); -const JuiceboxProject = require("./juice_project"); -const terminalV1 = require("./terminal_v1"); - -module.exports = { - operatorStore, - projects, - prices, - modStore, - ticketBooth, - fundingCycles, - directPaymentAddress, - proxyPaymentAddress, - proxyPaymentAddressManager, - terminalDirectory, - governance, - JuiceboxProject, - terminalV1, -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/index.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/index.js deleted file mode 100644 index b3b6463adc..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const setOperator = require("./set_operator"); -const setOperators = require("./set_operators"); -const transferProjectOwnership = require("./transfer_project_ownership"); -const pay = require("./pay"); -const setProjectId = require("./set_project_id"); -const withdraw = require("./withdraw"); -const takeFee = require("./take_fee"); - -module.exports = { - transferProjectOwnership, - setOperator, - setOperators, - pay, - setProjectId, - withdraw, - takeFee -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/pay.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/pay.js deleted file mode 100644 index e8d4c9be00..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/pay.js +++ /dev/null @@ -1,185 +0,0 @@ -const { expect } = require("chai"); -const { - ethers: { constants } -} = require("hardhat"); - -const tests = { - success: [ - { - description: "sets preferences", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true - }) - } - ], - failure: [ - { - description: "zero project", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true, - setup: { setTerminal: false, zeroProject: true }, - revert: "JuiceboxProject::pay: PROJECT_NOT_FOUND" - }) - }, - { - description: "zero terminal", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true, - setup: { setTerminal: false }, - revert: "JuiceboxProject::pay: TERMINAL_NOT_FOUND" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - beneficiary, - memo, - preferUnstakedTickets - } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(terminalV1.address); - - await terminalV1.mock.pay - .withArgs(this.projectId, beneficiary, memo, preferUnstakedTickets) - .returns(0); - - // Execute the transaction. - await this.contract - .connect(caller) - .pay(beneficiary, memo, preferUnstakedTickets, { - value: 1234 - }); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - beneficiary, - memo, - preferUnstakedTickets, - setup: { setTerminal = true, zeroProject = false } = {}, - revert - } = failureTest.fn(this); - - if (setTerminal) { - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(terminalV1.address); - await terminalV1.mock.pay - .withArgs(this.projectId, beneficiary, memo, preferUnstakedTickets) - .returns(0); - } else { - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(constants.AddressZero); - } - - if (zeroProject) { - await this.contract.connect(caller).setProjectId(0); - } - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .pay(beneficiary, memo, preferUnstakedTickets, { - value: 1234 - }) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operator.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operator.js deleted file mode 100644 index d3dfbad005..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operator.js +++ /dev/null @@ -1,93 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "sets operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - operator: addrs[0].address, - permissionIndexes: [1] - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - projectId: 1, - operator: addrs[0].address, - permissionIndexes: [1], - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - operator, - permissionIndexes - } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - - await operatorStore.mock.setOperator - .withArgs(operator, projectId, permissionIndexes) - .returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .setOperator( - operatorStore.address, - operator, - projectId, - permissionIndexes - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - projectId, - operator, - permissionIndexes, - revert - } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - - await operatorStore.mock.setOperator - .withArgs(operator, projectId, permissionIndexes) - .returns(); - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .setOperator( - operatorStore.address, - operator, - projectId, - permissionIndexes - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operators.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operators.js deleted file mode 100644 index 6d019481a5..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_operators.js +++ /dev/null @@ -1,93 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set operators", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectIds: [1, 2, 3], - operators: [addrs[0].address, addrs[1].address, addrs[2].address], - permissionIndexes: [[1], [2], [3]] - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - projectIds: [1, 2, 3], - operators: [addrs[0].address, addrs[1].address, addrs[2].address], - permissionIndexes: [[1], [2], [3]], - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectIds, - operators, - permissionIndexes - } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - - await operatorStore.mock.setOperators - .withArgs(operators, projectIds, permissionIndexes) - .returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .setOperators( - operatorStore.address, - operators, - projectIds, - permissionIndexes - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - projectIds, - operators, - permissionIndexes, - revert - } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - - await operatorStore.mock.setOperators - .withArgs(operators, projectIds, permissionIndexes) - .returns(); - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .setOperators( - operatorStore.address, - operators, - projectIds, - permissionIndexes - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_project_id.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_project_id.js deleted file mode 100644 index 7597e18e0e..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/set_project_id.js +++ /dev/null @@ -1,54 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "sets project ID", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1234 - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - projectId: 1234, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, projectId } = successTest.fn(this); - - // Execute the transaction. - await this.contract.connect(caller).setProjectId(projectId); - - // Get the stored project ID. - const storedProjectId = await this.contract.projectId(); - - // Expect the stored values to match. - expect(storedProjectId).to.equal(projectId); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, projectId, revert } = failureTest.fn(this); - - // Execute the transaction. - await expect( - this.contract.connect(caller).setProjectId(projectId) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/take_fee.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/take_fee.js deleted file mode 100644 index 74468f247d..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/take_fee.js +++ /dev/null @@ -1,198 +0,0 @@ -const { expect } = require("chai"); -const { - ethers: { constants } -} = require("hardhat"); - -const tests = { - success: [ - { - description: "takes fee", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true - }) - } - ], - failure: [ - { - description: "zero project", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true, - setup: { setTerminal: false, zeroProject: true }, - revert: "JuiceboxProject::takeFee: PROJECT_NOT_FOUND" - }) - }, - { - description: "zero terminal", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true, - setup: { setTerminal: false }, - revert: "JuiceboxProject::takeFee: TERMINAL_NOT_FOUND" - }) - }, - { - description: "insufficient funds", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - memo: "some-memo", - preferUnstakedTickets: true, - setup: { setTerminal: true }, - revert: "JuiceboxProject::takeFee: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - beneficiary, - memo, - preferUnstakedTickets - } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(terminalV1.address); - - await terminalV1.mock.pay - .withArgs(this.projectId, beneficiary, memo, preferUnstakedTickets) - .returns(0); - - const value = 1234; - await caller.sendTransaction({ - to: this.contract.address, - value - }); - - // Execute the transaction. - await this.contract - .connect(caller) - .takeFee(value, beneficiary, memo, preferUnstakedTickets); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - beneficiary, - memo, - preferUnstakedTickets, - setup: { setTerminal = true, zeroProject = false } = {}, - revert - } = failureTest.fn(this); - - if (setTerminal) { - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(terminalV1.address); - await terminalV1.mock.pay - .withArgs(this.projectId, beneficiary, memo, preferUnstakedTickets) - .returns(0); - } else { - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(constants.AddressZero); - } - - if (zeroProject) { - await this.contract.connect(caller).setProjectId(0); - } - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .takeFee(1234, beneficiary, memo, preferUnstakedTickets) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/transfer_project_ownership.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/transfer_project_ownership.js deleted file mode 100644 index 89fe34d8df..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/transfer_project_ownership.js +++ /dev/null @@ -1,89 +0,0 @@ -const { - ethers: { utils } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "transfers ownership", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - newOwner: addrs[0].address, - projectId: 1 - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - newOwner: addrs[0].address, - projectId: 1, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, newOwner, projectId } = successTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - - const data = utils.formatBytes32String("some-data"); - - await projects.mock.safeTransferFrom - .withArgs(this.contract.address, newOwner, projectId, data) - .returns(); - - // Execute the transaction. - await this.contract - .connect(caller) - .transferProjectOwnership( - projects.address, - newOwner, - projectId, - data - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, newOwner, projectId, revert } = failureTest.fn(this); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - - const data = utils.formatBytes32String("some-data"); - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .transferProjectOwnership( - projects.address, - newOwner, - projectId, - data - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/withdraw.js b/packages/hardhat/test/unit/behaviors/juice_project/behaviors/withdraw.js deleted file mode 100644 index 1b68a44e28..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/behaviors/withdraw.js +++ /dev/null @@ -1,65 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "withdraws", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - value: 1234 - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - caller: addrs[0].address, - beneficiary: addrs[0].address, - value: 1234, - revert: "Ownable: caller is not the owner" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, beneficiary, value } = successTest.fn(this); - - await caller.sendTransaction({ - to: this.contract.address, - value - }); - - // Expect the stored values to match. - const preBalance = await this.contract.provider.getBalance( - this.contract.address - ); - expect(preBalance).to.equal(value); - // Execute the transaction. - await this.contract.connect(caller).withdraw(beneficiary, value); - const balance = await this.contract.provider.getBalance( - this.contract.address - ); - - expect(balance).to.equal(0); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, beneficiary, value, revert } = failureTest.fn(this); - - // Execute the transaction. - await expect( - this.contract.connect(caller).withdraw(beneficiary, value) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/juice_project/index.js b/packages/hardhat/test/unit/behaviors/juice_project/index.js deleted file mode 100644 index 3160b46534..0000000000 --- a/packages/hardhat/test/unit/behaviors/juice_project/index.js +++ /dev/null @@ -1,32 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "ExampleJuiceboxProject"; - -module.exports = function() { - // Before the tests, deploy the contract. - before(async function() { - this.projectId = 1; - - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.projectId, - this.terminalDirectory.address - ]); - }); - - // Test each function. - describe("setOperator(...)", shouldBehaveLike.setOperator); - describe("setOperators(...)", shouldBehaveLike.setOperators); - describe( - "transferProjectOwnership(...)", - shouldBehaveLike.transferProjectOwnership - ); - describe("pay(...)", shouldBehaveLike.pay); - describe("takeFee(...)", shouldBehaveLike.takeFee); - describe("setProjectId(...)", shouldBehaveLike.setProjectId); - describe("withdraw(...)", shouldBehaveLike.withdraw); -}; diff --git a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/index.js b/packages/hardhat/test/unit/behaviors/mod_store/behaviors/index.js deleted file mode 100644 index 053bea7221..0000000000 --- a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const setPayoutMods = require("./set_payment_mods"); -const setTicketMods = require("./set_ticket_mods"); - -module.exports = { - setPayoutMods, - setTicketMods -}; diff --git a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_payment_mods.js b/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_payment_mods.js deleted file mode 100644 index 8fe2d18d40..0000000000 --- a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_payment_mods.js +++ /dev/null @@ -1,702 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set one payout mod, called by owner, max percent", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 10000, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set one payout mod, beneficiary is different from caller", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: addrs[0].address, - percent: 10000, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set many payout mods, called by owner", - fn: ({ deployer, modAllocator }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 5000, - preferUnstaked: false, - lockedUntil: 0 - }, - { - allocator: modAllocator.address, - projectId: 2, - beneficiary: ethers.constants.AddressZero, - percent: 2500, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set one payout mod, called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: addrs[0].address, - projectId: 1, - configuration: 10, - permissionFlag: true, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 5000, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "lock passed", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 4, - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(10) - }, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 4, - beneficiary: deployer.address, - // different properties. - percent: 200, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "lock and included with different unstaked preferences", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 4, - beneficiary: deployer.address, - percent: 100, - preferUnstaked: true, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(9) - }, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 4, - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: testStart.add(10) - }, - { - allocator: ethers.constants.AddressZero, - projectId: 2, - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "not locked if different configuration", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 11, - mods: [ - { - beneficiary: addrs[0].address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ] - }) - }, - { - description: "not locked if different project", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 11, - configuration: 10, - mods: [ - { - beneficiary: addrs[0].address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ] - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: addrs[0].address, - projectOwner: addrs[0].address, - projectId: 1, - configuration: 10, - mods: [], - permissionFlag: false, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "no mods", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [], - revert: "ModStore::setPayoutMods: NO_OP" - }) - }, - { - description: "no allocator or beneficiary", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: ethers.constants.AddressZero, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setPayoutMods: ZERO_ADDRESS" - }) - }, - { - description: "mod percent over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 10010, - preferUnstaked: false, - lockedUntil: 0 - }, - { - allocator: ethers.constants.AddressZero, - projectId: 2, - beneficiary: deployer.address, - percent: 50, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setPayoutMods: BAD_TOTAL_PERCENT" - }) - }, - { - description: "mod percent is 0%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 0, - preferUnstaked: false, - lockedUntil: 0 - }, - { - allocator: ethers.constants.AddressZero, - projectId: 2, - beneficiary: deployer.address, - percent: 50, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setPayoutMods: BAD_MOD_PERCENT" - }) - }, - { - description: "total percents over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - allocator: ethers.constants.AddressZero, - projectId: 1, - beneficiary: deployer.address, - percent: 9000, - preferUnstaked: false, - lockedUntil: 0 - }, - { - allocator: ethers.constants.AddressZero, - projectId: 2, - beneficiary: deployer.address, - percent: 1010, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setPayoutMods: BAD_TOTAL_PERCENT" - }) - }, - { - description: "locked with different beneficiaries", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: addrs[0].address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - percent: 50, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - }, - { - description: "locked with different percents", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - percent: 200, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - percent: 100, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - }, - { - description: "locked with different allocators", - fn: ({ deployer, modAllocator, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - percent: 200, - beneficiary: deployer.address, - allocator: modAllocator.address, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - percent: 200, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - }, - { - description: "locked with different project", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - percent: 200, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - percent: 200, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 3, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - }, - { - description: "locked with shorter locked until values", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - percent: 100, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - percent: 100, - beneficiary: deployer.address, - allocator: ethers.constants.AddressZero, - projectId: 2, - preferUnstaked: false, - lockedUntil: testStart.add(9) - } - ], - revert: "ModStore::setPayoutMods: SOME_LOCKED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectOwner, - projectId, - configuration, - mods, - setup, - permissionFlag - } = successTest.fn(this); - - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 14; - - // Set the Operator store to return the permission flag. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - - if (setup) { - if (setup.mods) { - if (setup.projectId !== projectId) { - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(setup.projectId) - .returns(projectOwner); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(setup.projectId) - .returns(caller.address); - } - // Execute the transaction. - await this.contract - .connect(caller) - .setPayoutMods(setup.projectId, setup.configuration, setup.mods); - } - if (setup.fastforward) { - // Fast forward the clock if needed. - // Subtract 1 so that the next operations mined block is likely to fall on the intended timestamp. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(setup.fastforward.sub(1)); - } - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .setPayoutMods(projectId, configuration, mods); - - // Get the stored payout mods value. - const storedProjectMods = await this.contract.payoutModsOf( - projectId, - configuration - ); - - // Expect an event to have been emitted for each mod. - await Promise.all( - storedProjectMods.map(mod => - expect(tx) - .to.emit(this.contract, "SetPayoutMod") - .withArgs(projectId, configuration, mod, caller.address) - ) - ); - - // Expect there to be the same number of stored mods. - expect(mods.length).equal(storedProjectMods.length); - - // Expect the stored mods values to match. - mods.forEach((mod, i) => { - expect(storedProjectMods[i].allocator).to.equal(mod.allocator); - expect(storedProjectMods[i].beneficiary).to.equal(mod.beneficiary); - expect(storedProjectMods[i].percent).to.equal(mod.percent); - expect(storedProjectMods[i].preferUnstaked).to.equal( - mod.preferUnstaked - ); - expect(storedProjectMods[i].projectId).to.equal(mod.projectId); - expect(storedProjectMods[i].lockedUntil).to.equal(mod.lockedUntil); - }); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectOwner, - projectId, - configuration, - mods, - permissionFlag, - setup, - revert - } = failureTest.fn(this); - - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - if (permissionFlag !== undefined) { - const permissionIndex = 14; - - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - if (setup) { - if (setup.mods) { - await this.contract - .connect(caller) - .setPayoutMods(setup.projectId, setup.configuration, setup.mods); - } - if (setup.fastforward) { - await this.fastforwardFn(setup.fastforward.sub(1)); - } - } - - await expect( - this.contract - .connect(caller) - .setPayoutMods(projectId, configuration, mods) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_ticket_mods.js b/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_ticket_mods.js deleted file mode 100644 index e51bfe12c4..0000000000 --- a/packages/hardhat/test/unit/behaviors/mod_store/behaviors/set_ticket_mods.js +++ /dev/null @@ -1,647 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set one ticket mod, called by owner, max percent", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 10000, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set one ticket mod, beneficiary is different from caller", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: addrs[0].address, - percent: 10000, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set many ticket mods, called by owner", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - }, - { - beneficiary: deployer.address, - percent: 50, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "set one ticket mod, called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: addrs[0].address, - projectId: 1, - configuration: 10, - permissionFlag: true, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "lock passed", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(10) - }, - mods: [ - { - beneficiary: deployer.address, - // different properties. - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "lock and included with different unstaked preferences", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: true, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(9) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: testStart.add(10) - }, - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "lock and included with longer lock", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: true, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(9) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: testStart.add(11) - }, - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ] - }) - }, - { - description: "not locked with different configurations", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 11, - mods: [ - { - beneficiary: addrs[0].address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - }, - { - description: "not locked with different projects", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 11, - configuration: 10, - mods: [ - { - beneficiary: addrs[0].address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: addrs[0].address, - projectOwner: addrs[0].address, - projectId: 1, - configuration: 10, - mods: [], - permissionFlag: false, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "no mods", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [], - revert: "ModStore::setTicketMods: NO_OP" - }) - }, - { - description: "locked with difference beneficiaries", - fn: ({ deployer, addrs, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: addrs[0].address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - }, - { - description: "locked with different percents", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - }, - { - description: "locked with shorter locked until values", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(8) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 200, - preferUnstaked: false, - lockedUntil: testStart.add(9) - } - ], - revert: "ModStore::setTicketMods: SOME_LOCKED" - }) - }, - { - description: "no beneficiary", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: ethers.constants.AddressZero, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setTicketMods: ZERO_ADDRESS" - }) - }, - { - description: "mod percent over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 10010, - preferUnstaked: false, - lockedUntil: 0 - }, - { - beneficiary: deployer.address, - percent: 50, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setTicketMods: BAD_TOTAL_PERCENT" - }) - }, - { - description: "mod percent over 100% with locked", - fn: ({ deployer, testStart }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - setup: { - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 10000, - preferUnstaked: false, - lockedUntil: testStart.add(10) - } - ], - fastforward: ethers.BigNumber.from(9) - }, - mods: [ - { - beneficiary: deployer.address, - percent: 10000, - preferUnstaked: false, - lockedUntil: testStart.add(10) - }, - { - beneficiary: deployer.address, - percent: 100, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setTicketMods: BAD_TOTAL_PERCENT" - }) - }, - { - description: "mod percent is 0%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 0, - preferUnstaked: false, - lockedUntil: 0 - }, - { - beneficiary: deployer.address, - percent: 50, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setTicketMods: BAD_MOD_PERCENT" - }) - }, - { - description: "total percents over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - controller: deployer.address, - projectOwner: deployer.address, - projectId: 1, - configuration: 10, - mods: [ - { - beneficiary: deployer.address, - percent: 9000, - preferUnstaked: false, - lockedUntil: 0 - }, - { - beneficiary: deployer.address, - percent: 1010, - preferUnstaked: false, - lockedUntil: 0 - } - ], - revert: "ModStore::setTicketMods: BAD_TOTAL_PERCENT" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectOwner, - projectId, - configuration, - mods, - setup, - permissionFlag - } = successTest.fn(this); - - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - const permissionIndex = 15; - - // Set the Operator store to return the permission flag. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - - if (setup) { - if (setup.mods) { - if (setup.projectId !== projectId) { - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(setup.projectId) - .returns(projectOwner); - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(setup.projectId) - .returns(caller.address); - } - // Execute the transaction. - await this.contract - .connect(caller) - .setTicketMods(setup.projectId, setup.configuration, setup.mods); - } - if (setup.fastforward) { - // Fast forward the clock if needed. - // Subtract 1 so that the next operations mined block is likely to fall on the intended timestamp. - // eslint-disable-next-line no-await-in-loop - await this.fastforwardFn(setup.fastforward.sub(1)); - } - } - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .setTicketMods(projectId, configuration, mods); - - // Get the stored ticket mods value. - const storedTicketMods = await this.contract.ticketModsOf( - projectId, - configuration - ); - - // Expect an event to have been emitted for each mod. - await Promise.all( - storedTicketMods.map(mod => - expect(tx) - .to.emit(this.contract, "SetTicketMod") - .withArgs(projectId, configuration, mod, caller.address) - ) - ); - - // Expect there to be the same number of stored mods. - expect(mods.length).equal(storedTicketMods.length); - - // Expect the stored mods values to match. - mods.forEach((mod, i) => { - expect(storedTicketMods[i].beneficiary).to.equal(mod.beneficiary); - expect(storedTicketMods[i].percent).to.equal(mod.percent); - expect(storedTicketMods[i].preferUnstaked).to.equal( - mod.preferUnstaked - ); - expect(storedTicketMods[i].lockedUntil).to.equal(mod.lockedUntil); - }); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectOwner, - projectId, - configuration, - mods, - permissionFlag, - setup, - revert - } = failureTest.fn(this); - - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the caller to be the project's controller for setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - if (permissionFlag !== undefined) { - const permissionIndex = 15; - - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - if (setup) { - if (setup.mods) { - await this.contract - .connect(caller) - .setTicketMods(setup.projectId, setup.configuration, setup.mods); - } - if (setup.fastforward) { - await this.fastforwardFn(setup.fastforward.sub(1)); - } - } - - await expect( - this.contract - .connect(caller) - .setTicketMods(projectId, configuration, mods) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/mod_store/index.js b/packages/hardhat/test/unit/behaviors/mod_store/index.js deleted file mode 100644 index cb6fad29d5..0000000000 --- a/packages/hardhat/test/unit/behaviors/mod_store/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "ModStore"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - this.projects = await this.deployMockLocalContractFn("Projects"); - this.operatorStore = await this.deployMockLocalContractFn("OperatorStore"); - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - this.modAllocator = await this.deployMockLocalContractFn( - "ExampleModAllocator" - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.projects.address, - this.operatorStore.address, - this.terminalDirectory.address - ]); - }); - - // Test each function. - describe("setPayoutMods(...)", shouldBehaveLike.setPayoutMods); - describe("setTicketMods(...)", shouldBehaveLike.setTicketMods); -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permission.js b/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permission.js deleted file mode 100644 index 6573734c69..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permission.js +++ /dev/null @@ -1,160 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "has permission, account is caller", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42, 41, 255] - }, - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndex: 42 - }, - result: true - }) - }, - { - description: "has permission, account is not caller", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [7] - }, - check: { - caller: addrs[1], - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndex: 7 - }, - result: true - }) - }, - { - description: "doesnt have permission, never set", - fn: ({ deployer, addrs }) => ({ - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndex: 42 - }, - result: false - }) - }, - { - description: "doesnt have permission, indexes differ", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [1, 2, 3] - }, - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndex: 42 - }, - result: false - }) - }, - { - description: "doesnt have permission, domain differs", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42] - }, - check: { - caller: deployer, - account: deployer, - domain: 0, - operator: addrs[0], - permissionIndex: 42 - }, - result: false - }) - } - ], - failure: [ - { - description: "index out of bounds", - fn: ({ deployer, addrs }) => ({ - check: { - caller: deployer, - account: deployer, - domain: 0, - operator: addrs[0], - permissionIndex: 256 - }, - revert: "OperatorStore::hasPermission: INDEX_OUT_OF_BOUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { set, check, result } = successTest.fn(this); - - // If specified, set an operator before the rest of the test. - if (set) { - await this.contract - .connect(set.caller) - .setOperator( - set.operator.address, - set.domain, - set.permissionIndexes - ); - } - - // Check for permissions. - const flag = await this.contract - .connect(check.caller) - .hasPermission( - check.operator.address, - check.account.address, - check.domain, - check.permissionIndex - ); - - expect(flag).to.equal(result); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { check, revert } = failureTest.fn(this); - await expect( - this.contract - .connect(check.caller) - .hasPermission( - check.operator.address, - check.account.address, - check.domain, - check.permissionIndex - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permissions.js b/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permissions.js deleted file mode 100644 index 78f3234fcc..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/has_permissions.js +++ /dev/null @@ -1,178 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "has permissions, account is caller", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42, 41, 255] - }, - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42, 41] - }, - result: true - }) - }, - { - description: "has permissions, account is not caller", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [7, 8, 9] - }, - check: { - caller: addrs[1], - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [7] - }, - result: true - }) - }, - { - description: "doesnt have permissions, never set", - fn: ({ deployer, addrs }) => ({ - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42] - }, - result: false - }) - }, - { - description: "doesnt have permission, all indexes differ", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [1, 2, 3] - }, - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42] - }, - result: false - }) - }, - { - description: "doesnt have permission, some indexes differ", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [1, 2, 3] - }, - check: { - caller: deployer, - account: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [1, 42] - }, - result: false - }) - }, - { - description: "doesnt have permissions, domain differs", - fn: ({ deployer, addrs }) => ({ - set: { - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: [42] - }, - check: { - caller: deployer, - account: deployer, - domain: 0, - operator: addrs[0], - permissionIndexes: [42] - }, - result: false - }) - } - ], - failure: [ - { - description: "index out of bounds", - fn: ({ deployer, addrs }) => ({ - check: { - caller: deployer, - account: deployer, - domain: 0, - operator: addrs[0], - permissionIndexes: [256] - }, - revert: "OperatorStore::hasPermissions: INDEX_OUT_OF_BOUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { set, check, result } = successTest.fn(this); - - // If specified, set an operator before the rest of the test. - if (set) { - await this.contract - .connect(set.caller) - .setOperator( - set.operator.address, - set.domain, - set.permissionIndexes - ); - } - - // Check for permissions. - const flag = await this.contract - .connect(check.caller) - .hasPermissions( - check.operator.address, - check.account.address, - check.domain, - check.permissionIndexes - ); - expect(flag).to.equal(result); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { check, revert } = failureTest.fn(this); - await expect( - this.contract - .connect(check.caller) - .hasPermissions( - check.operator.address, - check.account.address, - check.domain, - check.permissionIndexes - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/index.js b/packages/hardhat/test/unit/behaviors/operator_store/behaviors/index.js deleted file mode 100644 index e3566ce780..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const hasPermission = require("./has_permission"); -const hasPermissions = require("./has_permissions"); -const setOperator = require("./set_operator"); -const setOperators = require("./set_operators"); - -module.exports = { - hasPermission, - hasPermissions, - setOperator, - setOperators -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operator.js b/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operator.js deleted file mode 100644 index 278a15c3e8..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operator.js +++ /dev/null @@ -1,123 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set operator, no previously set value", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: { - set: [42, 41, 255] - } - }) - }, - { - description: "set operator, overriding previously set value", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: { - pre: [33], - set: [42, 41, 255] - } - }) - }, - { - description: "set operator, clearing any previously set value", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domain: 1, - operator: addrs[0], - permissionIndexes: { - pre: [33], - set: [] - } - }) - } - ], - failure: [ - { - description: "index out of bounds", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domain: 0, - operator: addrs[0], - permissionIndexes: [256], - revert: "OperatorStore::_packedPermissions: INDEX_OUT_OF_BOUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, domain, operator, permissionIndexes } = successTest.fn( - this - ); - - // If specified, pre-set an operator before the rest of the test. - if (permissionIndexes.pre) { - await this.contract - .connect(caller) - .setOperator(operator.address, domain, permissionIndexes.pre); - } - - // Calculate the expected packed value once the permissions are set. - const expectedPackedPermissions = permissionIndexes.set.reduce( - (sum, i) => sum.add(ethers.BigNumber.from(2).pow(i)), - ethers.BigNumber.from(0) - ); - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .setOperator(operator.address, domain, permissionIndexes.set); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "SetOperator") - .withArgs( - operator.address, - caller.address, - domain, - permissionIndexes.set, - expectedPackedPermissions - ); - - // Get the stored packed permissions value. - const storedPackedPermissions = await this.contract.permissionsOf( - operator.address, - caller.address, - domain - ); - - // Expect the packed values to match. - expect(storedPackedPermissions).to.equal(expectedPackedPermissions); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - domain, - operator, - permissionIndexes, - revert - } = failureTest.fn(this); - await expect( - this.contract - .connect(caller) - .setOperator(operator.address, domain, permissionIndexes) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operators.js b/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operators.js deleted file mode 100644 index e96ed85137..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/behaviors/set_operators.js +++ /dev/null @@ -1,278 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set operators, no previously set values", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 2], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [ - [42, 41, 255], - [4, 255, 3] - ], - expect: [ - [42, 41, 255], - [4, 255, 3] - ] - } - }) - }, - { - description: "set operators, overriding previously set values", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 1], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - pre: [[33], [23]], - set: [[42, 41, 255], [3]], - expect: [[42, 41, 255], [3]] - } - }) - }, - { - description: "set operators, clearing any previously set values", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [0, 1], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - pre: [[33], [33]], - set: [[], []], - expect: [[], []] - } - }) - }, - { - description: - "set operators, with the same operator used for two different projects", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [0, 1], - operators: [addrs[0], addrs[0]], - permissionIndexes: { - set: [ - [42, 41, 255], - [4, 255, 3] - ], - expect: [ - [42, 41, 255], - [4, 255, 3] - ] - } - }) - }, - { - description: - "set operators, with the same operator used for the same project", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [0, 0], - operators: [addrs[0], addrs[0]], - permissionIndexes: { - set: [ - [42, 41, 255], - [4, 255, 3] - ], - expect: [ - [4, 255, 3], - [4, 255, 3] - ] - } - }) - }, - { - description: "set only one operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1], - operators: [addrs[0]], - permissionIndexes: { - set: [[42, 41, 255]], - expect: [[42, 41, 255]] - } - }) - } - ], - failure: [ - { - description: "not enough projects specified", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [ - [42, 41, 255], - [4, 255, 3] - ], - expect: [ - [42, 41, 255], - [4, 255, 3] - ] - }, - revert: "OperatorStore::setOperators: BAD_ARGS" - }) - }, - { - description: "too many projects specified", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 2, 3], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [ - [42, 41, 255], - [4, 255, 3] - ], - expect: [ - [42, 41, 255], - [4, 255, 3] - ] - }, - revert: "OperatorStore::setOperators: BAD_ARGS" - }) - }, - { - description: "not enough permission indexes specified", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 2], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [[42, 41, 255]], - expect: [[42, 41, 255]] - }, - revert: "OperatorStore::setOperators: BAD_ARGS" - }) - }, - { - description: "too many permission indexes specified", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 2], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [ - [42, 41, 255], - [42, 41, 255], - [42, 41, 255] - ], - expect: [ - [42, 41, 255], - [42, 41, 255], - [42, 41, 255] - ] - }, - revert: "OperatorStore::setOperators: BAD_ARGS" - }) - }, - { - description: "index out of bounds", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - domains: [1, 2], - operators: [addrs[0], addrs[1]], - permissionIndexes: { - set: [ - [42, 41, 256], - [4, 255, 3] - ], - expect: [ - [42, 41, 255], - [4, 255, 3] - ] - }, - revert: "OperatorStore::_packedPermissions: INDEX_OUT_OF_BOUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - domains, - operators, - permissionIndexes - } = successTest.fn(this); - - // If specified, pre-set an operator before the rest of the test. - if (permissionIndexes.pre) { - await this.contract.connect(caller).setOperators( - operators.map(o => o.address), - domains, - permissionIndexes.pre - ); - } - - // Execute the transaction - const tx = await this.contract.connect(caller).setOperators( - operators.map(o => o.address), - domains, - permissionIndexes.set - ); - - // For each operator... - await Promise.all( - operators.map(async (operator, i) => { - // Calculate the expected packed values once the permissions are set. - const expectedPackedPermissions = permissionIndexes.expect[ - i - ].reduce( - (sum, index) => sum.add(ethers.BigNumber.from(2).pow(index)), - ethers.BigNumber.from(0) - ); - - // Expect an event to be emitted. - expect(tx) - .to.emit(this.contract, "SetOperator") - .withArgs( - operator.address, - caller.address, - domains[i], - permissionIndexes.expect[i], - expectedPackedPermissions - ); - - // Get the stored packed permissions values. - const storedPackedPermissions = await this.contract.permissionsOf( - operator.address, - caller.address, - domains[i] - ); - // Expect the packed values to match. - expect(storedPackedPermissions).to.equal(expectedPackedPermissions); - }) - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - domains, - operators, - permissionIndexes, - revert - } = failureTest.fn(this); - await expect( - this.contract.connect(caller).setOperators( - operators.map(o => o.address), - domains, - permissionIndexes.set - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/operator_store/index.js b/packages/hardhat/test/unit/behaviors/operator_store/index.js deleted file mode 100644 index 2a8cee1d3c..0000000000 --- a/packages/hardhat/test/unit/behaviors/operator_store/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "OperatorStore"; - -module.exports = function() { - // Before the tests, deploy the contract. - before(async function() { - // Deploy the contract. - this.contract = await this.deployContractFn(contractName); - }); - - // Test each function. - describe("setOperator(...)", shouldBehaveLike.setOperator); - describe("setOperators(...)", shouldBehaveLike.setOperators); - describe("hasPermission(...)", shouldBehaveLike.hasPermission); - describe("hasPermissions(...)", shouldBehaveLike.hasPermissions); -}; diff --git a/packages/hardhat/test/unit/behaviors/prices/behaviors/add_feed.js b/packages/hardhat/test/unit/behaviors/prices/behaviors/add_feed.js deleted file mode 100644 index 06bb37e8f7..0000000000 --- a/packages/hardhat/test/unit/behaviors/prices/behaviors/add_feed.js +++ /dev/null @@ -1,133 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "add feed, 18 decimals", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 18 - }) - }, - { - description: "add feed, 0 decimals", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 0 - }) - } - ], - failure: [ - { - description: "not owner", - fn: ({ addrs }) => ({ - caller: addrs[0], - currency: 1, - decimals: 18, - revert: "Ownable: caller is not the owner" - }) - }, - { - description: "reserved currency", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 0, - decimals: 18, - revert: "Prices::addFeed: RESERVED" - }) - }, - { - description: "already exists", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 18, - setup: { preset: true }, - revert: "Prices::addFeed: ALREADY_EXISTS" - }) - }, - { - description: "over 18 decimals", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 19, - revert: "Prices::addFeed: BAD_DECIMALS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, currency, decimals } = successTest.fn(this); - - // Set the mock to the return the specified number of decimals. - await this.aggregatorV3Contract.mock.decimals.returns(decimals); - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .addFeed(this.aggregatorV3Contract.address, currency); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "AddFeed") - .withArgs(currency, this.aggregatorV3Contract.address); - - // Get a reference to the target number of decimals. - const targetDecimals = await this.contract.targetDecimals(); - - // Get the stored decimal adjuster value. - const storedFeedDecimalAdjuster = await this.contract.feedDecimalAdjuster( - currency - ); - - // Get a reference to the expected adjuster value. - const expectedFeedDecimalAdjuster = ethers.BigNumber.from(10).pow( - targetDecimals - decimals - ); - // Expect the stored value to match the expected value. - expect(storedFeedDecimalAdjuster).to.equal(expectedFeedDecimalAdjuster); - - // Get the stored feed. - const storedFeed = await this.contract.feedFor(currency); - - // Expect the stored feed values to match. - expect(storedFeed).to.equal(this.aggregatorV3Contract.address); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - currency, - decimals, - revert, - setup: { preset } = {} - } = failureTest.fn(this); - - await this.aggregatorV3Contract.mock.decimals.returns(decimals); - - if (preset) { - await this.contract - .connect(caller) - .addFeed(this.aggregatorV3Contract.address, currency); - } - - await expect( - this.contract - .connect(caller) - .addFeed(this.aggregatorV3Contract.address, currency) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/prices/behaviors/get_eth_price_for.js b/packages/hardhat/test/unit/behaviors/prices/behaviors/get_eth_price_for.js deleted file mode 100644 index 2a4c87a95b..0000000000 --- a/packages/hardhat/test/unit/behaviors/prices/behaviors/get_eth_price_for.js +++ /dev/null @@ -1,111 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "check ETH price, non-zero currency, 18 decimals", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 18, - price: 400 - }) - }, - { - description: "check ETH price, non-zero currency, 0 decimals", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 0, - price: 400 - }) - }, - { - description: "check ETH price, zero currency", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 0, - price: 1 - }) - } - ], - failure: [ - { - description: "currency feed not found", - fn: ({ deployer }) => ({ - caller: deployer, - currency: 1, - decimals: 18, - price: 400, - revert: "Prices::getETHPrice: NOT_FOUND" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, currency, decimals, price } = successTest.fn(this); - - // If the currency is 0, mocks or a feed aren't needed. - if (currency > 0) { - // Set the mock to the return the specified number of decimals. - await this.aggregatorV3Contract.mock.decimals.returns(decimals); - // Set the mock to return the specified price. - await this.aggregatorV3Contract.mock.latestRoundData.returns( - 0, - price, - 0, - 0, - 0 - ); - - // Add price feed. - await this.contract - .connect(caller) - .addFeed(this.aggregatorV3Contract.address, currency); - } - - // Check for the price. - const resultingPrice = await this.contract - .connect(caller) - .getETHPriceFor(currency); - - // Get a reference to the target number of decimals. - const targetDecimals = await this.contract.targetDecimals(); - - // Get a reference to the expected price value. - const expectedPrice = ethers.BigNumber.from(price).mul( - ethers.BigNumber.from(10).pow( - currency === 0 ? targetDecimals : targetDecimals - decimals - ) - ); - - // Expect the stored price value to match the expected value. - expect(resultingPrice).to.equal(expectedPrice); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, currency, price, revert } = failureTest.fn(this); - - await this.aggregatorV3Contract.mock.latestRoundData.returns( - 0, - price, - 0, - 0, - 0 - ); - - await expect( - this.contract.connect(caller).getETHPriceFor(currency) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/prices/behaviors/index.js b/packages/hardhat/test/unit/behaviors/prices/behaviors/index.js deleted file mode 100644 index 5ad123bcb3..0000000000 --- a/packages/hardhat/test/unit/behaviors/prices/behaviors/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const getETHPriceFor = require("./get_eth_price_for"); -const addFeed = require("./add_feed"); - -module.exports = { - getETHPriceFor, - addFeed -}; diff --git a/packages/hardhat/test/unit/behaviors/prices/index.js b/packages/hardhat/test/unit/behaviors/prices/index.js deleted file mode 100644 index dde14d8a50..0000000000 --- a/packages/hardhat/test/unit/behaviors/prices/index.js +++ /dev/null @@ -1,22 +0,0 @@ -const AggregatorV3Interface = require("@chainlink/contracts/abi/v0.6/AggregatorV3Interface.json"); - -const shouldBehaveLike = require("./behaviors"); - -const contractName = "Prices"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy a mock of the price feed oracle contract. - this.aggregatorV3Contract = await this.deployMockContractFn( - AggregatorV3Interface.compilerOutput.abi - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName); - }); - - // Test each function. - describe("addFeed(...)", shouldBehaveLike.addFeed); - describe("getETHPriceFor(...)", shouldBehaveLike.getETHPriceFor); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/challenge_handle.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/challenge_handle.js deleted file mode 100644 index 1966594087..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/challenge_handle.js +++ /dev/null @@ -1,113 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "challenge successfully", - fn: ({ deployer }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - } - } - }) - } - ], - failure: [ - { - description: "handle not taken", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - } - }, - revert: "Projects::challenge: HANDLE_NOT_TAKEN" - }) - }, - { - description: "already being challenged", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - prechallenge: true, - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-handle") - } - }, - revert: "Projects::challenge: HANDLE_ALREADY_BEING_CHALLENGED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, handle, setup: { create } = {} } = successTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - - // Execute the transaction. - const tx = await this.contract.connect(caller).challengeHandle(handle); - - const expectedChallengeExpiry = ( - await this.getTimestampFn(tx.blockNumber) - ).add(31536000); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "ChallengeHandle") - .withArgs(create.handle, expectedChallengeExpiry, caller.address); - - // Get the stored reverse handle lookup value. - const storedchallengeExpiryOf = await this.contract.challengeExpiryOf( - create.handle - ); - - // Expect the stored value to be zero. - expect(storedchallengeExpiryOf).to.equal(expectedChallengeExpiry); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - handle, - setup: { create, prechallenge } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - - if (prechallenge) { - // Challenge the handle. - await this.contract.connect(caller).challengeHandle(handle); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).challengeHandle(handle) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/claim_handle.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/claim_handle.js deleted file mode 100644 index e161ba16fc..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/claim_handle.js +++ /dev/null @@ -1,422 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "claim handle", - fn: ({ deployer }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: deployer.address, - setup: { - source: { - owner: deployer, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: deployer.address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - } - } - }) - }, - { - description: "called by personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[2].address, - setup: { - source: { - owner: deployer, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: addrs[2].address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - }, - transferToPermissionFlag: true, - transferToPersonalPermission: true, - claimOntoPermissionFlag: true - } - }) - }, - { - description: "called by project operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[2].address, - setup: { - source: { - owner: deployer, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: addrs[2].address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - }, - transferToPermissionFlag: true, - transferToPersonalPermission: false, - claimOntoPermissionFlag: true - } - }) - }, - { - description: - "claim handle to a random other address after challenge expired", - fn: ({ deployer, addrs }) => ({ - caller: addrs[6], - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[6].address, - setup: { - challengeHandle: ethers.utils.formatBytes32String("some-handle"), - fastforward: ethers.BigNumber.from(31536000), - source: { - owner: deployer, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: addrs[6].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - } - } - }) - } - ], - failure: [ - { - description: "unauthorized, transfered to inaccessible address", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[3].address, - setup: { - source: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: addrs[3].address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - }, - transferToPermissionFlag: false, - transferToPersonalPermission: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: - "unauthorized, transfered to inaccessible address, cant operate project", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: deployer.address, - setup: { - source: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: addrs[3].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: deployer.address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - }, - transferToPermissionFlag: true, - transferToPersonalPermission: false, - claimOntoPermissionFlag: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "unauthorized, wrong for and challenge not expired", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[1].address, - setup: { - source: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-other-handle") - }, - transfer: { - projectId: 1, - to: deployer.address, - newHandle: ethers.utils.formatBytes32String("some-new-handle") - }, - transferToPermissionFlag: true, - transferToPersonalPermission: true, - claimOntoPermissionFlag: true - }, - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - }, - { - description: - "claim handle to a random other address but challenge not yet expired", - fn: ({ deployer, addrs }) => ({ - caller: addrs[6], - handle: ethers.utils.formatBytes32String("some-handle"), - claimFor: addrs[6].address, - setup: { - challengeHandle: ethers.utils.formatBytes32String("some-handle"), - fastforward: ethers.BigNumber.from(31535998), - source: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - destination: { - owner: addrs[6].address, - handle: ethers.utils.formatBytes32String("some-other-handle") - } - }, - revert: "Projects::claimHandle: UNAUTHORIZED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - handle, - claimFor, - setup: { - source, - destination, - transfer, - transferToPermissionFlag, - transferToPersonalPermission, - claimOntoPermissionFlag, - challengeHandle, - fastforward - } = {} - } = successTest.fn(this); - - // Setup by creating a project that the handle will be transfered from. - await this.contract - .connect(caller) - .create( - source.owner.address, - source.handle, - "", - this.constants.AddressZero - ); - // Setup by creating another project that the handle will be transfered to. - await this.contract - .connect(caller) - .create( - destination.owner, - destination.handle, - "", - this.constants.AddressZero - ); - - if (transfer) { - // Execute the transaction. - await this.contract - .connect(source.owner) - .transferHandle( - transfer.projectId, - transfer.to, - transfer.newHandle - ); - } - - const permissionIndex = 7; - if (transferToPermissionFlag !== undefined) { - // Flip the opposit of what what specified in the personal permissions to false. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - claimFor, - transferToPersonalPermission ? 2 : 0, - permissionIndex - ) - .returns(false); - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - claimFor, - transferToPersonalPermission ? 0 : 2, - permissionIndex - ) - .returns(transferToPermissionFlag); - } - if (claimOntoPermissionFlag !== undefined) { - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, destination.owner, 2, permissionIndex) - .returns(claimOntoPermissionFlag); - } - - // Challenge the handle if needed. - if (challengeHandle) { - const tx = await this.contract - .connect(caller) - .challengeHandle(challengeHandle); - await this.setTimeMarkFn(tx.blockNumber); - } - - // Fastforward if needed. - // The next transaction will happen one second after. - if (fastforward) await this.fastforwardFn(fastforward); - - const tx = await this.contract - .connect(caller) - .claimHandle(handle, claimFor, 2); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "ClaimHandle") - .withArgs(claimFor, 2, handle, caller.address); - - // Get the stored handle value. - const storedHandle = await this.contract.handleOf(2); - - // Get the stored project value. - const storedProject = await this.contract.projectFor(handle); - - // Get the stored challenge expiry of. - const storedChallengeExpiryOf = await this.contract.challengeExpiryOf( - handle - ); - - // Expect the stored values to equal the set values. - expect(storedHandle).to.equal(handle); - expect(storedProject).to.equal(2); - expect(storedChallengeExpiryOf).to.equal(0); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - handle, - claimFor, - setup: { - source, - destination, - transfer, - transferToPermissionFlag, - transferToPersonalPermission, - claimOntoPermissionFlag, - challengeHandle, - fastforward - } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project that the handle will be transfered from. - await this.contract - .connect(caller) - .create(source.owner, source.handle, "", this.constants.AddressZero); - - // Setup by creating another project that the handle will be transfered to. - await this.contract - .connect(caller) - .create( - destination.owner, - destination.handle, - "", - this.constants.AddressZero - ); - - if (transfer) { - // Execute the transaction. - await this.contract - .connect(caller) - .transferHandle( - transfer.projectId, - transfer.to, - transfer.newHandle - ); - } - - const permissionIndex = 7; - if (transferToPermissionFlag !== undefined) { - // Flip the opposit of what what specified in the personal permissions to false. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - claimFor, - transferToPersonalPermission ? 2 : 0, - permissionIndex - ) - .returns(false); - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - claimFor, - transferToPersonalPermission ? 0 : 2, - permissionIndex - ) - .returns(transferToPermissionFlag); - } - if (claimOntoPermissionFlag !== undefined) { - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, destination.owner, 2, permissionIndex) - .returns(claimOntoPermissionFlag); - } - - // Challenge the handle if needed. - if (challengeHandle) { - const tx = await this.contract - .connect(caller) - .challengeHandle(challengeHandle); - await this.setTimeMarkFn(tx.blockNumber); - } - - // Fastforward if needed. - // The next transaction will happen one second after. - if (fastforward) await this.fastforwardFn(fastforward); - - // Execute the transaction. - await expect( - this.contract.connect(caller).claimHandle(handle, claimFor, 2) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/create.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/create.js deleted file mode 100644 index 6875fe58a0..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/create.js +++ /dev/null @@ -1,266 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "no uri, caller is owner", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "", - terminal: ethers.constants.AddressZero, - expectation: { - projectId: 1 - } - }) - }, - { - description: "no uri, caller is not owner", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "", - terminal: ethers.constants.AddressZero, - expectation: { - projectId: 1 - } - }) - }, - { - description: "with uri", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri", - terminal: ethers.constants.AddressZero, - expectation: { - projectId: 1 - } - }) - }, - { - description: "second project", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri", - terminal: ethers.constants.AddressZero, - expectation: { - projectId: 2 - }, - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-other-handle"), - uri: "some-uri", - terminal: ethers.constants.AddressZero - } - } - }) - }, - { - description: "with terminal", - fn: async ({ deployer, deployMockLocalContractFn }) => { - // Create a mock for a terminalV1. - const operatorStore = await deployMockLocalContractFn("OperatorStore"); - const projects = await deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await deployMockLocalContractFn("Prices"); - const terminalDirectory = await deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await deployMockLocalContractFn("FundingCycles", [ - terminalDirectory.address - ]); - const ticketBooth = await deployMockLocalContractFn("TicketBooth", [ - projects.address, - operatorStore.address, - terminalDirectory.address - ]); - const modStore = await deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const terminalV1 = await deployMockLocalContractFn("TerminalV1", [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ]); - // make the mock terminalDirectory return a mock of the terminal directory. - await terminalV1.mock.terminalDirectory - .withArgs() - .returns(terminalDirectory.address); - - // mock the set terminal function of the terminal directory. - await terminalDirectory.mock.setTerminal - .withArgs(1, terminalV1.address) - .returns(); - - return { - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "", - terminal: terminalV1.address, - expectation: { - projectId: 1 - } - }; - } - } - ], - failure: [ - { - description: "no handle", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String(""), - uri: "", - terminal: ethers.constants.AddressZero, - revert: "Projects::create: EMPTY_HANDLE" - }) - }, - { - description: "handle taken", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri", - terminal: ethers.constants.AddressZero, - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri" - } - }, - revert: "Projects::create: HANDLE_TAKEN" - }) - }, - { - description: "handle being transfered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri", - terminal: ethers.constants.AddressZero, - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle"), - uri: "some-uri" - }, - transfer: { - owner: deployer.address, - to: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-new-handle") - } - }, - revert: "Projects::create: HANDLE_TAKEN" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - owner, - handle, - uri, - terminal, - setup: { create } = {}, - expectation: { projectId } - } = await successTest.fn(this); - - // Setup by creating a project. - if (create) { - await this.contract - .connect(caller) - .create(create.owner, create.handle, create.uri, create.terminal); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .create(owner, handle, uri, terminal); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "Create") - .withArgs(projectId, owner, handle, uri, terminal, caller.address); - - // Get the stored handle value. - const storedHandle = await this.contract.handleOf(projectId); - - // Get the stored project value. - const storedProject = await this.contract.projectFor(handle); - - // Get the stored uri value. - const storedUri = await this.contract.uriOf(projectId); - - // Expect the stored values to equal the set values. - expect(storedHandle).to.equal(handle); - expect(storedProject).to.equal(projectId); - expect(storedUri).to.equal(uri); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - owner, - handle, - uri, - terminal, - setup: { create, transfer } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - if (create) { - await this.contract - .connect(caller) - .create( - create.owner, - create.handle, - create.uri, - this.constants.AddressZero - ); - - if (transfer) { - await this.contract - .connect(caller) - .transferHandle(1, transfer.to, transfer.handle); - } - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).create(owner, handle, uri, terminal) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/index.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/index.js deleted file mode 100644 index 9040ce3a78..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const create = require("./create"); -const setHandle = require("./set_handle"); -const setUri = require("./set_uri"); -const transferHandle = require("./transfer_handle"); -const claimHandle = require("./claim_handle"); -const renewHandle = require("./renew_handle"); -const challengeHandle = require("./challenge_handle"); - -module.exports = { - create, - setHandle, - setUri, - transferHandle, - claimHandle, - renewHandle, - challengeHandle -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/renew_handle.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/renew_handle.js deleted file mode 100644 index 55ae8659d8..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/renew_handle.js +++ /dev/null @@ -1,127 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "called by owner", - fn: ({ deployer }) => ({ - caller: deployer, - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - } - } - }) - }, - { - description: "called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - setup: { - create: { - owner: addrs[1].address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - permissionFlag: true - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - setup: { - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-old-handle") - }, - permissionFlag: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - setup: { create, permissionFlag } = {} - } = successTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - - // Challenge the handle. - await this.contract.connect(caller).challengeHandle(create.handle); - - if (permissionFlag !== undefined) { - const permissionIndex = 8; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - const tx = await this.contract.connect(caller).renewHandle(1); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "RenewHandle") - .withArgs(create.handle, 1, caller.address); - - // Get the stored reverse handle lookup value. - const storedchallengeExpiryOf = await this.contract.challengeExpiryOf( - create.handle - ); - - // Expect the stored value to be zero. - expect(storedchallengeExpiryOf).to.equal(0); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - setup: { create, permissionFlag } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - - // Challenge the handle. - await this.contract.connect(caller).challengeHandle(create.handle); - - if (permissionFlag !== undefined) { - const permissionIndex = 8; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).renewHandle(1) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/set_handle.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/set_handle.js deleted file mode 100644 index 4ea8cb684b..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/set_handle.js +++ /dev/null @@ -1,178 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "different handle", - fn: ({ deployer }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-old-handle") - } - } - }) - }, - { - description: "called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-old-handle") - }, - permissionFlag: true - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-old-handle") - }, - permissionFlag: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "no handle", - fn: ({ deployer }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String(""), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-old-handle") - } - }, - revert: "Projects::setHandle: EMPTY_HANDLE" - }) - }, - { - description: "handle taken", - fn: ({ deployer }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - } - }, - revert: "Projects::setHandle: HANDLE_TAKEN" - }) - }, - { - description: "handle being transfered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - handle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - transfer: { - owner: deployer.address, - to: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-new-handle") - } - }, - revert: "Projects::setHandle: HANDLE_TAKEN" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - handle, - setup: { create, permissionFlag } = {} - } = successTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - if (permissionFlag !== undefined) { - const permissionIndex = 5; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - const tx = await this.contract.connect(caller).setHandle(1, handle); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "SetHandle") - .withArgs(1, handle, caller.address); - - // Get the stored handle value. - const storedHandle = await this.contract.handleOf(1); - - // Get the stored project value. - const storedProject = await this.contract.projectFor(handle); - - // Expect the stored values to equal the set values. - expect(storedHandle).to.equal(handle); - expect(storedProject).to.equal(1); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - handle, - setup: { create, transfer, permissionFlag } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - if (transfer) { - await this.contract - .connect(caller) - .transferHandle(1, transfer.to, transfer.handle); - } - if (permissionFlag !== undefined) { - const permissionIndex = 5; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).setHandle(1, handle) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/set_uri.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/set_uri.js deleted file mode 100644 index 5681b57da9..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/set_uri.js +++ /dev/null @@ -1,130 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "different uri", - fn: ({ deployer }) => ({ - caller: deployer, - uri: "some-uri", - setup: { - create: { - owner: deployer.address - } - } - }) - }, - { - description: "called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - uri: "some-uri", - setup: { - create: { - owner: addrs[0].address - }, - permissionFlag: true - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - uri: "some-uri", - setup: { - create: { - owner: addrs[0].address - }, - permissionFlag: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - uri, - setup: { create, permissionFlag } = {} - } = successTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create( - create.owner, - ethers.utils.formatBytes32String("some-handle"), - "", - this.constants.AddressZero - ); - if (permissionFlag !== undefined) { - const permissionIndex = 6; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - const tx = await this.contract.connect(caller).setUri(1, uri); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "SetUri") - .withArgs(1, uri, caller.address); - - // Get the stored uri value. - const storedUri = await this.contract.uriOf(1); - - // Expect the stored values to equal the set values. - expect(storedUri).to.equal(uri); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - uri, - setup: { create, permissionFlag } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create( - create.owner, - ethers.utils.formatBytes32String("some-handle"), - "", - this.constants.AddressZero - ); - - if (permissionFlag !== undefined) { - const permissionIndex = 6; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).setUri(1, uri) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/behaviors/transfer_handle.js b/packages/hardhat/test/unit/behaviors/projects/behaviors/transfer_handle.js deleted file mode 100644 index 336b396009..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/behaviors/transfer_handle.js +++ /dev/null @@ -1,197 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "transfers handle", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - newHandle: ethers.utils.formatBytes32String("some-new-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - } - } - }) - }, - { - description: "called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - newHandle: ethers.utils.formatBytes32String("some-new-handle"), - setup: { - create: { - owner: addrs[1].address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - permissionFlag: true - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - newHandle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-old-handle") - }, - permissionFlag: false - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "no handle", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - newHandle: ethers.utils.formatBytes32String(""), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-old-handle") - } - }, - revert: "Projects::transferHandle: EMPTY_HANDLE" - }) - }, - { - description: "handle taken", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - newHandle: ethers.utils.formatBytes32String("some-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - } - }, - revert: "Projects::transferHandle: HANDLE_TAKEN" - }) - }, - { - description: "handle being transfered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - to: addrs[0].address, - owner: deployer.address, - newHandle: ethers.utils.formatBytes32String("some-new-handle"), - setup: { - create: { - owner: deployer.address, - handle: ethers.utils.formatBytes32String("some-handle") - }, - transfer: { - owner: deployer.address, - to: addrs[0].address, - handle: ethers.utils.formatBytes32String("some-new-handle") - } - }, - revert: "Projects::transferHandle: HANDLE_TAKEN" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - to, - newHandle, - setup: { create, permissionFlag } = {} - } = successTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - if (permissionFlag !== undefined) { - const permissionIndex = 5; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .transferHandle(1, to, newHandle); - - // Expect an event to have been emitted. - expect(tx) - .to.emit(this.contract, "TransferHandle") - .withArgs(1, to, create.handle, newHandle, caller.address); - - // Get the stored reverse handle lookup value. - const storedHandle = await this.contract.handleOf(1); - - // Get the stored handle resolver value. - const storedProject = await this.contract.projectFor(create.handle); - - const storedNewProject = await this.contract.projectFor(newHandle); - - const storedTransferedAddress = await this.contract.transferAddressFor( - create.handle - ); - - // Expect the stored values to equal the set values. - expect(storedHandle).to.equal(newHandle); - expect(storedProject).to.equal(0); - expect(storedNewProject).to.equal(1); - expect(storedTransferedAddress).to.equal(to); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - to, - newHandle, - setup: { create, transfer, permissionFlag } = {}, - revert - } = failureTest.fn(this); - - // Setup by creating a project. - await this.contract - .connect(caller) - .create(create.owner, create.handle, "", this.constants.AddressZero); - if (transfer) { - await this.contract - .connect(caller) - .transferHandle(1, transfer.to, transfer.handle); - } - if (permissionFlag !== undefined) { - const permissionIndex = 5; - - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, create.owner, 1, permissionIndex) - .returns(permissionFlag); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).transferHandle(1, to, newHandle) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/projects/index.js b/packages/hardhat/test/unit/behaviors/projects/index.js deleted file mode 100644 index 968443395b..0000000000 --- a/packages/hardhat/test/unit/behaviors/projects/index.js +++ /dev/null @@ -1,25 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "Projects"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - this.operatorStore = await this.deployMockLocalContractFn("OperatorStore"); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.operatorStore.address - ]); - }); - - // Test each function. - describe("create(...)", shouldBehaveLike.create); - describe("setHandle(...)", shouldBehaveLike.setHandle); - describe("setUri(...)", shouldBehaveLike.setUri); - describe("transferHandle(...)", shouldBehaveLike.transferHandle); - describe("claimHandle(...)", shouldBehaveLike.claimHandle); - describe("renewHandle(...)", shouldBehaveLike.renewHandle); - describe("challengeHandle(...)", shouldBehaveLike.challengeHandle); -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/index.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/index.js deleted file mode 100644 index 04808ab001..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const tap = require("./tap"); -const transferTickets = require("./transfer_tickets"); - -module.exports = { - tap, - transferTickets, -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/tap.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/tap.js deleted file mode 100644 index 0d96fa3542..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/tap.js +++ /dev/null @@ -1,78 +0,0 @@ -const { - ethers: { constants }, -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "tap", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - ops: [ - { - sender: addrs[0], - value: 1, - }, - { - sender: addrs[1], - value: 2, - }, - { - sender: addrs[0], - value: 4, - }, - ], - beneficiary: addrs[2], - }), - }, - ], -}; - -module.exports = function () { - describe("Success cases", function () { - tests.success.forEach(function (successTest) { - it(successTest.description, async function () { - const { caller, ops } = successTest.fn(this); - - await Promise.all( - ops.map(async (op) => { - // Execute the transaction. - const tx = await op.sender.sendTransaction({ - to: this.contract.address, - value: op.value, - }); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Receive") - .withArgs(op.sender.address, op.value); - }) - ); - - const expectedBalance = ops.reduce((value, op) => value + op.value, 0); - - const storedBalance = await caller.provider.getBalance( - this.contract.address - ); - - expect(storedBalance).to.equal(expectedBalance); - - await this.terminalV1.mock.pay - .withArgs(this.projectId, this.contract.address, this.memo, false) - .returns(1); - - await this.terminalDirectory.mock.terminalOf - .withArgs(this.projectId) - .returns(this.terminalV1.address); - - const tapTx = await this.contract.connect(caller).tap(); - - // Expect an event to have been emitted. - await expect(tapTx) - .to.emit(this.contract, "Tap") - .withArgs(caller.address, expectedBalance); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/transfer_tickets.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/transfer_tickets.js deleted file mode 100644 index 630be19997..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address/behaviors/transfer_tickets.js +++ /dev/null @@ -1,51 +0,0 @@ -const { - ethers: { constants }, -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "transfer tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: deployer.address, - amount: 10, - beneficiary: addrs[2], - }), - }, - ], -}; - -module.exports = function () { - describe("Success cases", function () { - tests.success.forEach(function (successTest) { - it(successTest.description, async function () { - const { caller, beneficiary, amount } = successTest.fn(this); - - await this.ticketBooth.mock.transfer - .withArgs( - this.contract.address, - this.projectId, - amount, - beneficiary.address - ) - .returns(); - - const tx = await this.contract - .connect(caller) - .transferTickets(beneficiary.address, amount); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "TransferTickets") - .withArgs( - caller.address, - beneficiary.address, - this.projectId, - amount - ); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address/index.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address/index.js deleted file mode 100644 index ade60c05ab..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "ProxyPaymentAddress"; - -module.exports = function () { - // Before the tests, deploy mocked dependencies and the contract. - before(async function () { - // Deploy mock dependency contracts. - this.terminalV1 = await this.deployMockLocalContractFn("TerminalV1"); - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - this.ticketBooth = await this.deployMockLocalContractFn("TicketBooth"); - - // Deploy the contract. - this.projectId = 1; - this.memo = "some-memo"; - this.contract = await this.deployContractFn(contractName, [ - this.terminalDirectory.address, - this.ticketBooth.address, - this.projectId, - this.memo, - ]); - }); - - // Test each function. - describe("tap(...)", shouldBehaveLike.tap); - describe("transfer_tickets(...)", shouldBehaveLike.transferTickets); -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/deploy_proxy_payment_address.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/deploy_proxy_payment_address.js deleted file mode 100644 index 1611243118..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/deploy_proxy_payment_address.js +++ /dev/null @@ -1,73 +0,0 @@ -const { - ethers: { constants }, -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "deploy one proxy payment address", - fn: ({ deployer }) => ({ - caller: deployer, - ops: [ - { - projectId: 1, - memo: "some-memo", - }, - ], - expectations: [ - { - projectId: 1, - memos: ["some-memo"], - }, - ], - }), - }, - ], - failure: [ - { - description: "zero project", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 0, - memo: "some-memo", - revert: "ProxyPaymentAddressManager::deploy: ZERO_PROJECT", - }), - }, - ], -}; - -module.exports = function () { - describe("Success cases", function () { - tests.success.forEach(function (successTest) { - it(successTest.description, async function () { - const { caller, ops } = successTest.fn(this); - - await Promise.all( - ops.map(async (op) => { - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .deploy(op.projectId, op.memo); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Deploy") - .withArgs(op.projectId, op.memo, caller.address); - }) - ); - }); - }); - }); - describe("Failure cases", function () { - tests.failure.forEach(function (failureTest) { - it(failureTest.description, async function () { - const { caller, projectId, memo, revert } = failureTest.fn(this); - - await expect( - this.contract.connect(caller).deploy(projectId, memo) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/index.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/index.js deleted file mode 100644 index 6e491cc4aa..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/behaviors/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const deployProxyPaymentAddress = require("./deploy_proxy_payment_address"); - -module.exports = { - deployProxyPaymentAddress, -}; diff --git a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/index.js b/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/index.js deleted file mode 100644 index 6458ead52a..0000000000 --- a/packages/hardhat/test/unit/behaviors/proxy_payment_address_manager/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "ProxyPaymentAddressManager"; - -module.exports = function () { - // Before the tests, deploy mocked dependencies and the contract. - before(async function () { - // Deploy mock dependency contracts. - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - this.ticketBooth = await this.deployMockLocalContractFn("TicketBooth"); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.terminalDirectory.address, - this.ticketBooth.address, - ]); - }); - - // Test each function. - describe( - "deploy_proxy_payment_address(...)", - shouldBehaveLike.deployProxyPaymentAddress - ); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/deploy_address.js b/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/deploy_address.js deleted file mode 100644 index 325d92e6e9..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/deploy_address.js +++ /dev/null @@ -1,151 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "deploy one address", - fn: ({ deployer }) => ({ - caller: deployer, - ops: [ - { - projectId: 1, - memo: "some-memo" - } - ], - expectations: [ - { - projectId: 1, - memos: ["some-memo"] - } - ] - }) - }, - { - description: "deploy many addresses to one project", - fn: ({ deployer }) => ({ - caller: deployer, - ops: [ - { - projectId: 1, - memo: "some-memo" - }, - { - projectId: 1, - memo: "some-other-memo" - } - ], - expectations: [ - { - projectId: 1, - memos: ["some-memo", "some-other-memo"] - } - ] - }) - }, - { - description: "deploy many addresses to many project", - fn: ({ deployer }) => ({ - caller: deployer, - ops: [ - { - projectId: 1, - memo: "some-memo" - }, - { - projectId: 1, - memo: "some-other-memo" - }, - { - projectId: 2, - memo: "yet-another-memo" - }, - { - projectId: 2, - memo: "yet-some-other-memo" - } - ], - expectations: [ - { - projectId: 1, - memos: ["some-memo", "some-other-memo"] - }, - { - projectId: 2, - memos: ["yet-another-memo", "yet-some-other-memo"] - } - ] - }) - } - ], - failure: [ - { - description: "zero project", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 0, - memo: "some-memo", - revert: "TerminalDirectory::deployAddress: ZERO_PROJECT" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, ops, expectations } = successTest.fn(this); - - await Promise.all( - ops.map(async op => { - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .deployAddress(op.projectId, op.memo); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "DeployAddress") - .withArgs(op.projectId, op.memo, caller.address); - }) - ); - - // Attach the address to the Tickets contract. - const DirectPaymentAddressFactory = await ethers.getContractFactory( - "DirectPaymentAddress" - ); - - expectations.forEach(async expectation => { - // Get the stored addresses for the project. - const storedAddresses = await this.contract - .connect(caller) - .addressesOf(expectation.projectId); - storedAddresses.forEach(async (address, i) => { - const StoredDirectPaymentAddress = await DirectPaymentAddressFactory.attach( - address - ); - const storedProjectId = await StoredDirectPaymentAddress.projectId(); - const storedTerminalDirectory = await StoredDirectPaymentAddress.terminalDirectory(); - const storedMemo = await StoredDirectPaymentAddress.memo(); - - expect(storedProjectId).to.equal(expectation.projectId); - expect(storedTerminalDirectory).to.equal(this.contract.address); - expect(storedMemo).to.equal(expectation.memos[i]); - }); - }); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, projectId, memo, revert } = failureTest.fn(this); - - await expect( - this.contract.connect(caller).deployAddress(projectId, memo) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/index.js b/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/index.js deleted file mode 100644 index 89284ec241..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/index.js +++ /dev/null @@ -1,9 +0,0 @@ -const setTerminal = require("./set_terminal"); -const deployAddress = require("./deploy_address"); -const setPayerPreferences = require("./set_payer_preferences"); - -module.exports = { - setTerminal, - deployAddress, - setPayerPreferences -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_payer_preferences.js b/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_payer_preferences.js deleted file mode 100644 index 07bef59552..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_payer_preferences.js +++ /dev/null @@ -1,48 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "sets preferences", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - beneficiary: addrs[0].address, - prefereClaimedTickets: true, - }), - }, - ], -}; - -module.exports = function () { - describe("Success cases", function () { - tests.success.forEach(function (successTest) { - it(successTest.description, async function () { - const { caller, beneficiary, prefereClaimedTickets } = - successTest.fn(this); - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .setPayerPreferences(beneficiary, prefereClaimedTickets); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "SetPayerPreferences") - .withArgs(caller.address, beneficiary, prefereClaimedTickets); - - // Get the stored ticket for the caller. - const storedBeneficiary = await this.contract - .connect(caller) - .beneficiaryOf(caller.address); - - // Get the stored preference for the caller. - const storedPreferUnstakedTickets = await this.contract - .connect(caller) - .unstakedTicketsPreferenceOf(caller.address); - - expect(storedBeneficiary).to.equal(beneficiary); - expect(storedPreferUnstakedTickets).to.equal(prefereClaimedTickets); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_terminal.js b/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_terminal.js deleted file mode 100644 index 9bdfbf623d..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_directory/behaviors/set_terminal.js +++ /dev/null @@ -1,311 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "no terminal set yet, called by owner", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1 - }) - }, - { - description: "no terminal set yet, called by operator", - fn: ({ deployer, addrs }) => ({ - caller: addrs[0], - projectOwner: deployer.address, - projectId: 1, - setup: { permissionFlag: true } - }) - }, - { - description: "terminal set yet and is allowed, called by owner", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - setup: { - preset: { - allowMigration: true - } - } - }) - }, - { - description: "terminal set and is allowed, called by operator", - fn: ({ deployer, addrs }) => ({ - caller: addrs[0], - projectOwner: deployer.address, - projectId: 1, - setup: { - permissionFlag: true, - preset: { - allowMigration: true - } - } - }) - } - ], - failure: [ - { - description: "project not found", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - setup: { createProject: false, preset: false }, - revert: "TerminalDirectory::setTerminal: NOT_FOUND" - }) - }, - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: addrs[0], - projectOwner: deployer.address, - projectId: 1, - setup: { createProject: true, preset: false }, - revert: "TerminalDirectory::setTerminal: UNAUTHORIZED" - }) - }, - { - description: "terminal set yet and is not allowed, unauthorized", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - setup: { - createProject: true, - preset: { - allowMigration: false - } - }, - revert: "TerminalDirectory::setTerminal: UNAUTHORIZED" - }) - }, - { - description: "terminal set and is not allowed, unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: addrs[0], - projectOwner: deployer.address, - projectId: 1, - setup: { - permissionFlag: true, - createProject: true, - preset: { - allowMigration: false - } - }, - revert: "TerminalDirectory::setTerminal: UNAUTHORIZED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - projectOwner, - caller, - projectId, - setup: { permissionFlag, preset } = {}, - expect: { noEvent = false } = {} - } = successTest.fn(this); - - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the Operator store permissions. - const permissionIndex = 16; - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag || false); - - // The project should exist. - await this.projects.mock.exists.withArgs(projectId).returns(true); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const mockTerminal = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - - if (preset) { - const presetMockTerminal = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - await presetMockTerminal.mock.migrationIsAllowed - .withArgs(mockTerminal.address) - .returns(preset.allowMigration); - await this.contract - .connect(caller) - .setTerminal(projectId, presetMockTerminal.address); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .setTerminal(projectId, mockTerminal.address); - - if (noEvent) { - const receipt = await tx.wait(); - expect(receipt.events.length).to.equal(0); - } else { - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "SetTerminal") - .withArgs(projectId, mockTerminal.address, caller.address); - } - - // Get the stored ticket for the project. - const storedTerminal = await this.contract - .connect(caller) - .terminalOf(projectId); - - expect(storedTerminal).to.equal(mockTerminal.address); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - projectId, - projectOwner, - setup: { preset, createProject, permissionFlag } = {}, - revert - } = failureTest.fn(this); - - // Set the Projects mock to return the projectOwner. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Mock the Operator store permissions. - const permissionIndex = 16; - // Mock the caller to be the project's controller. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag || false); - - // The project should exist. - await this.projects.mock.exists - .withArgs(projectId) - .returns(createProject); - - const operatorStore = await this.deployMockLocalContractFn( - "OperatorStore" - ); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn( - "TicketBooth", - [projects.address, operatorStore.address, terminalDirectory.address] - ); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - // Deploy mock dependency contracts. - const mockTerminal = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - - if (preset) { - const presetMockTerminal = await this.deployMockLocalContractFn( - "TerminalV1", - [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address - ] - ); - await presetMockTerminal.mock.migrationIsAllowed - .withArgs(mockTerminal.address) - .returns(preset.allowMigration); - await this.contract - .connect(caller) - .setTerminal(projectId, presetMockTerminal.address); - } - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .setTerminal(projectId, mockTerminal.address) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_directory/index.js b/packages/hardhat/test/unit/behaviors/terminal_directory/index.js deleted file mode 100644 index e6ed54a36f..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_directory/index.js +++ /dev/null @@ -1,23 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "TerminalDirectory"; - -module.exports = function() { - // Before the tests, deploy the contract. - before(async function() { - // Deploy mock dependency contracts. - this.projects = await this.deployMockLocalContractFn("Projects"); - this.operatorStore = await this.deployMockLocalContractFn("OperatorStore"); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.projects.address, - this.operatorStore.address - ]); - }); - - // Test each function. - describe("deployAddress(...)", shouldBehaveLike.deployAddress); - describe("setTerminal(...)", shouldBehaveLike.setTerminal); - describe("setPayerPreferences(...)", shouldBehaveLike.setPayerPreferences); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/accept_governance.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/accept_governance.js deleted file mode 100644 index 6c72ec2c26..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/accept_governance.js +++ /dev/null @@ -1,64 +0,0 @@ -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "appoint", - fn: ({ addrs, governance }) => ({ - caller: governance, - governance: addrs[0] - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ governance }) => ({ - caller: governance, - revert: "TerminalV1::acceptGovernance: UNAUTHORIZED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, governance } = successTest.fn(this); - - // Appoint the governance that will accept. - await this.targetContract - .connect(caller) - .appointGovernance(governance.address); - - // Execute the transaction. - const tx = await this.targetContract - .connect(governance) - .acceptGovernance(); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "AcceptGovernance") - .withArgs(governance.address); - - // Get the stored pending governance value. - const storedGovernance = await this.targetContract.governance(); - - // Expect the stored value to equal whats expected. - expect(storedGovernance).to.equal(governance.address); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, revert } = failureTest.fn(this); - - await expect( - this.targetContract.connect(caller).acceptGovernance() - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/add_to_balance.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/add_to_balance.js deleted file mode 100644 index 6974ba3cd6..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/add_to_balance.js +++ /dev/null @@ -1,107 +0,0 @@ -const { - ethers: { BigNumber } -} = require("hardhat"); - -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "add with no preset balance", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - amount: BigNumber.from(1), - expectation: { - projectBalance: BigNumber.from(1) - } - }) - }, - { - description: "add with preset balance", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - amount: BigNumber.from(1), - setup: { - addToBalance: BigNumber.from(1) - }, - expectation: { - projectBalance: BigNumber.from(2) - } - }) - } - ], - failure: [ - { - description: "zero amount", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - amount: BigNumber.from(0), - revert: "TerminalV1::addToBalance: BAD_AMOUNT" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - amount, - setup: { addToBalance } = {}, - expectation: { projectBalance, totalBalanceWithoutYield } = {} - } = await successTest.fn(this); - if (addToBalance) { - await this.targetContract - .connect(caller) - .addToBalance(projectId, { value: addToBalance }); - } - - // Execute the transaction. - const tx = await this.targetContract - .connect(caller) - .addToBalance(projectId, { value: amount }); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "AddToBalance") - .withArgs(projectId, amount, caller.address); - - // Get the stored balance. - const storedBalanceOf = await this.targetContract.balanceOf(projectId); - - // Get the total stored balance. - const storedBalance = await this.deployer.provider.getBalance( - this.targetContract.address - ); - - // Expect the stored value to equal whats expected. - expect(storedBalanceOf).to.equal(projectBalance); - - // Expect the stored value to equal whats expected. - expect(storedBalance.amountWithoutYield).to.equal( - totalBalanceWithoutYield - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, projectId, amount, revert } = await failureTest.fn( - this - ); - await expect( - this.targetContract - .connect(caller) - .addToBalance(projectId, { value: amount }) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/allow_migration.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/allow_migration.js deleted file mode 100644 index 15e4a1cd6e..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/allow_migration.js +++ /dev/null @@ -1,90 +0,0 @@ -const { expect } = require("chai"); -const { constants } = require("ethers"); - -const tests = { - success: [ - { - description: "set a new terminal", - fn: async ({ governance, deployMockLocalContractFn, mockContracts }) => ({ - caller: governance, - terminal: ( - await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]) - ).address - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, targetContract }) => ({ - caller: deployer, - terminal: targetContract.address, - revert: "TerminalV1: UNAUTHORIZED" - }) - }, - { - description: "zero address", - fn: ({ governance }) => ({ - caller: governance, - terminal: constants.AddressZero, - revert: "TerminalV1::allowMigration: ZERO_ADDRESS" - }) - }, - { - description: "same as current", - fn: ({ governance, targetContract }) => ({ - caller: governance, - terminal: targetContract.address, - revert: "TerminalV1::allowMigration: NO_OP" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, terminal } = await successTest.fn(this); - - // Execute the transaction. - const tx = await this.targetContract - .connect(caller) - .allowMigration(terminal); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "AllowMigration") - .withArgs(terminal); - - // Get the stored allowed value. - const storedAllowedValue = await this.targetContract.migrationIsAllowed( - terminal - ); - - // Expect the stored value to equal whats expected. - expect(storedAllowedValue).to.equal(true); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, terminal, revert } = failureTest.fn(this); - - await expect( - this.targetContract.connect(caller).allowMigration(terminal) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/appoint_governance.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/appoint_governance.js deleted file mode 100644 index 8dcf8fa593..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/appoint_governance.js +++ /dev/null @@ -1,79 +0,0 @@ -const { - ethers: { constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "appoint", - fn: ({ addrs, governance }) => ({ - caller: governance, - governance: addrs[0].address - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer }) => ({ - caller: deployer, - governance: constants.AddressZero, - revert: "TerminalV1: UNAUTHORIZED" - }) - }, - { - description: "zero address", - fn: ({ governance }) => ({ - caller: governance, - governance: constants.AddressZero, - revert: "TerminalV1::appointGovernance: ZERO_ADDRESS" - }) - }, - { - description: "same as current", - fn: ({ governance }) => ({ - caller: governance, - governance: governance.address, - revert: "TerminalV1::appointGovernance: NO_OP" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, governance } = successTest.fn(this); - - // Execute the transaction. - const tx = await this.targetContract - .connect(caller) - .appointGovernance(governance); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "AppointGovernance") - .withArgs(governance); - - // Get the stored pending governance value. - const storedPendingGovernance = await this.targetContract.pendingGovernance(); - - // Expect the stored value to equal whats expected. - expect(storedPendingGovernance).to.equal(governance); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, governance, revert } = failureTest.fn(this); - - await expect( - this.targetContract.connect(caller).appointGovernance(governance) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/configure.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/configure.js deleted file mode 100644 index 5cf72c2670..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/configure.js +++ /dev/null @@ -1,341 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, utils, constants } = require("ethers"); - -const tests = { - success: [ - { - description: "by owner", - fn: () => ({}) - }, - { - description: "by operator", - fn: ({ addrs }) => ({ - owner: addrs[0].address, - permissionFlag: true - }) - }, - { - description: "with a terminal already set", - fn: () => ({ - addTerminal: true - }) - }, - { - description: "with mods", - fn: async ({ deployMockLocalContractFn }) => ({ - payoutMods: [ - { - // These values dont matter. - preferUnstaked: false, - percent: 200, - lockedUntil: 1000, - beneficiary: constants.AddressZero, - allocator: (await deployMockLocalContractFn("ExampleModAllocator")) - .address, - projectId: 1 - } - ], - ticketMods: [ - { - // These values dont matter. - preferUnstaked: false, - percent: 200, - lockedUntil: 1000, - beneficiary: constants.AddressZero - } - ] - }) - }, - { - description: "with a ticket supply", - fn: () => ({ - addToTicketSupply: 1 - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - owner: addrs[0].address, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "reserved rate over 100%", - fn: () => ({ - metadata: { - reservedRate: 201 - }, - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RESERVED_RATE" - }) - }, - { - description: "bonding curve rate over 100%", - fn: () => ({ - metadata: { - bondingCurveRate: 201 - }, - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_BONDING_CURVE_RATE" - }) - }, - { - description: "reconfiguration bonding curve rate over 100%", - fn: () => ({ - metadata: { - reconfigurationBondingCurveRate: 201 - }, - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RECONFIGURATION_BONDING_CURVE_RATE" - }) - } - ] -}; - -const mockFn = ({ - condition, - mockContract, - fn, - args = [], - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - await mockContract.mock[fn] - .withArgs(...normalizedArgs) - .returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - events.forEach(event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ); -}; - -const ops = ({ deployer, mockContracts, targetContract }) => custom => { - const { - caller = deployer, - permissionFlag = false, - addToTicketSupply = 0, - addTerminal, - owner = deployer.address, - payoutMods = [], - ticketMods = [], - handle = utils.formatBytes32String("something"), - uri = "some-uri", - metadata, - properties = { - target: 10, - currency: 1, - duration: 10, - cycleLimit: 0, - discountRate: 10, - ballot: constants.AddressZero - }, - projectId = 42, - configured = 171717, - revert - } = { - ...custom, - metadata: { - reservedRate: 200, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 200, - ...custom.metadata - } - }; - - return [ - mockFn({ - mockContract: mockContracts.projects, - fn: "ownerOf", - args: [projectId], - returns: [owner] - }), - mockFn({ - mockContract: mockContracts.operatorStore, - fn: "hasPermission", - args: () => { - const expectedPermissionIndex = 1; - return [caller.address, owner, projectId, expectedPermissionIndex]; - }, - returns: [permissionFlag || false] - }), - ...(!revert - ? [ - mockFn({ - condition: !revert, - mockContract: mockContracts.terminalDirectory, - fn: "terminalOf", - args: [projectId], - returns: [ - addTerminal ? constants.AddressZero : targetContract.address - ] - }) - ] - : []), - ...(!revert && addTerminal - ? [ - mockFn({ - mockContract: mockContracts.terminalDirectory, - fn: "setTerminal", - args: [projectId, targetContract.address] - }) - ] - : []), - ...(!revert - ? [ - mockFn({ - mockContract: mockContracts.projects, - fn: "create", - args: [owner, handle, uri, targetContract.address], - returns: [projectId] - }) - ] - : []), - ...(!revert - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [addToTicketSupply] - }) - ] - : []), - ...(!revert - ? [ - mockFn({ - condition: !revert, - mockContract: mockContracts.fundingCycles, - fn: "configure", - args: () => { - /** - Mock the funding cycle configuration. - - - requires calculating the expected packed metadata. - */ - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add( - metadata.reconfigurationBondingCurveRate - ); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.bondingCurveRate); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.reservedRate); - packedMetadata = packedMetadata.shl(8); - return [ - projectId, - properties, - packedMetadata, - 10, - !addToTicketSupply - ]; - }, - returns: [ - { - configured, - id: 0, - projectId: 0, - number: 0, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - cycleLimit: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: 0 - } - ] - }) - ] - : []), - ...(!revert && payoutMods.length - ? [ - mockFn({ - condition: !revert && payoutMods.length, - mockContract: mockContracts.modStore, - fn: "setPayoutMods", - args: [projectId, configured, payoutMods] - }) - ] - : []), - ...(!revert && ticketMods.length - ? [ - mockFn({ - condition: !revert && payoutMods.length, - mockContract: mockContracts.modStore, - fn: "setTicketMods", - args: [projectId, configured, payoutMods] - }) - ] - : []), - executeFn({ - caller, - contract: targetContract, - fn: "configure", - args: [projectId, properties, metadata, payoutMods, ticketMods], - revert - }) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/deploy.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/deploy.js deleted file mode 100644 index 35e1dad02c..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/deploy.js +++ /dev/null @@ -1,280 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, utils, constants } = require("ethers"); - -const tests = { - success: [ - { - description: "deposit for caller", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - metadata: { - reservedRate: 200, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 200 - }, - payoutMods: [], - ticketMods: [] - }) - }, - { - description: "deposit for another address", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - owner: addrs[0].address, - metadata: { - reservedRate: 200, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 200 - }, - payoutMods: [], - ticketMods: [] - }) - }, - { - description: "deposit with mods", - fn: async ({ deployer, deployMockLocalContractFn }) => ({ - caller: deployer, - owner: deployer.address, - metadata: { - reservedRate: 200, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 200 - }, - payoutMods: [ - { - // These values dont matter. - preferUnstaked: false, - percent: 200, - lockedUntil: 1000, - beneficiary: constants.AddressZero, - allocator: (await deployMockLocalContractFn("ExampleModAllocator")) - .address, - projectId: 1, - note: "banana" - } - ], - ticketMods: [ - { - // These values dont matter. - preferUnstaked: false, - percent: 200, - lockedUntil: 1000, - beneficiary: constants.AddressZero - } - ] - }) - } - ], - failure: [ - { - description: "reserved rate over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - metadata: { - reservedRate: 201, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 200 - }, - payoutMods: [], - ticketMods: [], - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RESERVED_RATE" - }) - }, - { - description: "bonding curve rate over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - metadata: { - reservedRate: 200, - bondingCurveRate: 201, - reconfigurationBondingCurveRate: 200 - }, - payoutMods: [], - ticketMods: [], - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_BONDING_CURVE_RATE" - }) - }, - { - description: "reconfiguration bonding curve rate over 100%", - fn: ({ deployer }) => ({ - caller: deployer, - owner: deployer.address, - metadata: { - reservedRate: 200, - bondingCurveRate: 200, - reconfigurationBondingCurveRate: 201 - }, - payoutMods: [], - ticketMods: [], - revert: - "TerminalV1::_validateAndPackFundingCycleMetadata: BAD_RECONFIGURATION_BONDING_CURVE_RATE" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - owner, - metadata, - payoutMods, - ticketMods - } = await successTest.fn(this); - const handle = utils.formatBytes32String("something"); - const uri = "some-uri"; - const properties = { - target: 10, - currency: 1, - duration: 10, - cycleLimit: 0, - discountRate: 10, - ballot: constants.AddressZero - }; - - const projectId = 42; - const configured = 171717; - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add( - metadata.reconfigurationBondingCurveRate - ); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.bondingCurveRate); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.reservedRate); - packedMetadata = packedMetadata.shl(8); - - // Set a mock for creating a project. - await this.mockContracts.projects.mock.create - .withArgs(owner, handle, uri, this.targetContract.address) - .returns(projectId); - // Set a mock for setting the terminal in the directory. - await this.mockContracts.terminalDirectory.mock.setTerminal - .withArgs(projectId, this.targetContract.address) - .returns(); - - // Set a mock for configuring a funding cycle. - await this.mockContracts.fundingCycles.mock.configure - .withArgs(projectId, properties, packedMetadata, 10, true) - .returns({ - configured, - cycleLimit: 0, - id: 0, - projectId: 0, - number: 0, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: 0 - }); - - if (payoutMods.length) - // Set a mock for setting payout mods. - await this.mockContracts.modStore.mock.setPayoutMods - .withArgs(projectId, configured, payoutMods) - .returns(); - - if (ticketMods.length) - // Set a mock for setting ticket mods. - await this.mockContracts.modStore.mock.setTicketMods - .withArgs(projectId, configured, ticketMods) - .returns(); - - // Execute the transaction. - await this.targetContract - .connect(caller) - .deploy( - owner, - handle, - uri, - properties, - metadata, - payoutMods, - ticketMods - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, owner, metadata, revert } = failureTest.fn(this); - const handle = utils.formatBytes32String("something"); - const uri = "some-uri"; - const properties = { - target: 10, - currency: 1, - duration: 10, - cycleLimit: 0, - discountRate: 10, - ballot: constants.AddressZero - }; - - const projectId = 42; - const configured = 171717; - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add( - metadata.reconfigurationBondingCurveRate - ); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.bondingCurveRate); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(metadata.reservedRate); - packedMetadata = packedMetadata.shl(8); - - // Set a mock for creating a project. - await this.mockContracts.projects.mock.create - .withArgs(owner, handle, uri, this.targetContract.address) - .returns(projectId); - // Set a mock for setting the terminal in the directory. - await this.mockContracts.terminalDirectory.mock.setTerminal - .withArgs(projectId, this.targetContract.address) - .returns(); - - // Set a mock for configuring a funding cycle. - await this.mockContracts.fundingCycles.mock.configure - .withArgs(projectId, properties, packedMetadata, 10, true) - .returns({ - configured, - cycleLimit: 0, - id: 0, - projectId: 0, - number: 0, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: 0 - }); - - // Execute the transaction. - await expect( - this.targetContract - .connect(caller) - .deploy(owner, handle, uri, properties, metadata, [], []) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/index.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/index.js deleted file mode 100644 index 9225a69914..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const appointGovernance = require("./appoint_governance"); -const acceptGovernance = require("./accept_governance"); -const setFee = require("./set_fee"); -const allowMigration = require("./allow_migration"); -const addToBalance = require("./add_to_balance"); -const migrate = require("./migrate"); -const deploy = require("./deploy"); -const configure = require("./configure"); -const pay = require("./pay"); -const printPreminedTickets = require("./print_premined_tickets"); -const redeem = require("./redeem"); -const tap = require("./tap"); -const printReservedTickets = require("./print_reserved_tickets"); - -module.exports = { - appointGovernance, - acceptGovernance, - setFee, - allowMigration, - addToBalance, - migrate, - deploy, - configure, - pay, - printPreminedTickets, - redeem, - tap, - printReservedTickets -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/migrate.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/migrate.js deleted file mode 100644 index 864c963e5f..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/migrate.js +++ /dev/null @@ -1,374 +0,0 @@ -const { - ethers: { BigNumber } -} = require("hardhat"); - -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "no preset balance", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance - }) => ({ - caller: deployer, - projectOwner: deployer.address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: {} - }) - }, - { - description: "with preset balance", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance - }) => ({ - caller: deployer, - projectOwner: deployer.address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - addToBalance: BigNumber.from(72) - } - }) - }, - { - description: "with unprinted reserved tickets", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance - }) => ({ - caller: deployer, - projectOwner: deployer.address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - unprintedReservedTicketAmount: BigNumber.from(1) - } - }) - }, - { - description: "with operator", - fn: async ({ - deployer, - addrs, - deployMockLocalContractFn, - mockContracts, - governance - }) => ({ - caller: deployer, - projectOwner: addrs[0].address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - permissionFlag: true - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance, - targetContract, - addrs - }) => { - return { - caller: deployer, - projectOwner: addrs[0].address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - allowMigration: false, - currentTerminal: targetContract - }, - revert: "Operatable: UNAUTHORIZED" - }; - } - }, - { - description: "unauthorized terminal", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance - }) => { - return { - caller: deployer, - projectOwner: deployer.address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - allowMigration: false, - currentTerminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]) - }, - revert: "TerminalV1::migrate: UNAUTHORIZED" - }; - } - }, - { - description: "not allowed", - fn: async ({ - deployer, - deployMockLocalContractFn, - mockContracts, - governance, - targetContract - }) => { - return { - caller: deployer, - projectOwner: deployer.address, - governance, - projectId: 1, - terminal: await deployMockLocalContractFn("TerminalV1", [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]), - setup: { - allowMigration: false, - currentTerminal: targetContract - }, - revert: "TerminalV1::migrate: NOT_ALLOWED" - }; - } - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectOwner, - governance, - projectId, - terminal, - setup: { - unprintedReservedTicketAmount = BigNumber.from(0), - permissionFlag, - addToBalance = 0 - } = {} - } = await successTest.fn(this); - - // Mock the Operator store permissions. - const permissionIndex = 4; - // Mock the caller to be the project's controller. - await this.mockContracts.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag || false); - - // Allow migration to the given terminal. - await this.targetContract - .connect(governance) - .allowMigration(terminal.address); - - await this.mockFn({ - mockContract: this.mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [unprintedReservedTicketAmount] - }); - - // Add to balance if needed. - if (addToBalance) { - await this.targetContract.addToBalance(projectId, { - value: addToBalance - }); - // Mock the ability to add a balance to the terminal. - await terminal.mock.addToBalance.withArgs(projectId).returns(); - } - - // Mock the terminal directory setting process. - await this.mockContracts.terminalDirectory.mock.setTerminal - .withArgs(projectId, terminal.address) - .returns(); - await this.mockContracts.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(this.targetContract.address); - - // Set the project owner. - await this.mockContracts.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - if (unprintedReservedTicketAmount.gt(0)) - await this.mockFn({ - mockContract: this.mockContracts.fundingCycles, - fn: "currentOf", - args: [projectId], - returns: [ - { - configured: 0, - cycleLimit: 0, - id: 0, - projectId, - number: 0, - basedOn: 0, - weight: 0, - ballot: this.constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: 0 - } - ] - }); - - // Execute the transaction. - const tx = await this.targetContract - .connect(caller) - .migrate(projectId, terminal.address); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "Migrate") - .withArgs(projectId, terminal.address, addToBalance, caller.address); - - // Get the stored target value. - const storedBalance = await this.targetContract.balanceOf(projectId); - - // Expect the stored value to equal whats expected. - expect(storedBalance).to.equal(0); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - projectOwner, - governance, - projectId, - terminal, - setup: { allowMigration, currentTerminal, permissionFlag } = {}, - revert - } = await failureTest.fn(this); - - // Mock the Operator store permissions. - const permissionIndex = 4; - - // Mock the caller to be the project's controller. - await this.mockContracts.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag || false); - - if (allowMigration) - // Allow migration to the given terminal. - await this.targetContract - .connect(governance) - .allowMigration(terminal.address); - - await this.mockContracts.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(currentTerminal.address); - - // Set the project owner. - await this.mockContracts.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Execute the transaction. - await expect( - this.targetContract - .connect(caller) - .migrate(projectId, terminal.address) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/pay.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/pay.js deleted file mode 100644 index e87053c796..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/pay.js +++ /dev/null @@ -1,260 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, constants } = require("ethers"); - -const tests = { - success: [ - { - description: "with no balance", - fn: () => ({}) - }, - { - description: "with balance", - fn: () => ({ - addToBalance: BigNumber.from(42) - }) - }, - { - description: "with no funding cycle", - fn: () => ({ - fundingCycleNumber: 0, - unreservedWeightedAmount: BigNumber.from(10) - .pow(18) - .mul(420) - }) - }, - { - description: "reserved rate 100%", - fn: () => ({ - reservedRate: 200 - }) - } - ], - failure: [ - { - description: "paid zero", - fn: () => ({ - amount: BigNumber.from(0), - revert: "TerminalV1::pay: BAD_AMOUNT" - }) - }, - { - description: "zero address beneficiary", - fn: () => ({ - beneficiary: constants.AddressZero, - revert: "TerminalV1::pay: ZERO_ADDRESS" - }) - } - ] -}; - -const mockFn = ({ - condition, - mockContract, - fn, - args = [], - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - await mockContract.mock[fn] - .withArgs(...normalizedArgs) - .returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - await Promise.all( - events.map(async event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ) - ); -}; - -const check = ({ condition, contract, fn, args, value }) => async () => { - if (condition !== undefined && !condition) return; - const storedVal = await contract[fn](...args); - expect(storedVal).to.equal(value); -}; - -const ops = ({ deployer, mockContracts, targetContract }) => custom => { - const { - caller = deployer, - addToBalance = BigNumber.from(0), - beneficiary = deployer.address, - memo = "some-memo", - preferUnstaked = false, - amount = BigNumber.from(10) - .pow(18) - .mul(42), - weight = BigNumber.from(10) - .pow(18) - .mul(10), - unreservedWeightedAmount = BigNumber.from(10) - .pow(18) - .mul(399), - reservedRate = 10, - projectId = 42, - fundingCycleId = 1, - fundingCycleNumber = 1, - revert - } = { - ...custom - }; - - // Create a packed metadata value to store the reserved rate. - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add(42); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(42); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(reservedRate); - packedMetadata = packedMetadata.shl(8); - - return [ - mockFn({ - condition: !revert, - mockContract: mockContracts.fundingCycles, - fn: "currentOf", - args: [projectId], - returns: [ - { - configured: 0, - cycleLimit: 0, - id: fundingCycleId, - projectId, - number: fundingCycleNumber, - basedOn: 0, - weight, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: packedMetadata - } - ] - }), - ...(fundingCycleNumber === 0 - ? [ - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "BASE_WEIGHT", - args: [], - returns: [weight] - }) - ] - : []), - executeFn({ - condition: !revert && addToBalance > 0, - caller, - contract: targetContract, - fn: "addToBalance", - args: [projectId], - value: addToBalance - }), - mockFn({ - condition: !revert, - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [beneficiary, projectId, unreservedWeightedAmount, preferUnstaked], - returns: [] - }), - executeFn({ - caller, - contract: targetContract, - fn: "pay", - args: [projectId, beneficiary, memo, preferUnstaked], - value: amount, - events: [ - { - name: "Pay", - args: [ - fundingCycleId, - projectId, - beneficiary, - amount, - memo, - caller.address - ] - } - ], - revert - }), - check({ - condition: !revert, - contract: targetContract, - fn: "balanceOf", - args: [projectId], - value: addToBalance.add(amount) - }), - mockFn({ - condition: !revert, - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [unreservedWeightedAmount] - }), - check({ - condition: !revert, - contract: targetContract, - fn: "canPrintPreminedTickets", - args: [projectId], - value: fundingCycleNumber === 0 - }) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_premined_tickets.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_premined_tickets.js deleted file mode 100644 index 54c3e19688..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_premined_tickets.js +++ /dev/null @@ -1,281 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, constants } = require("ethers"); - -const tests = { - success: [ - { - description: "called by owner", - fn: () => ({}) - }, - { - description: "called by operator", - fn: ({ addrs }) => ({ - owner: addrs[0].address, - permissionFlag: true - }) - }, - { - description: "max uint", - fn: ({ addrs }) => ({ - owner: addrs[0].address, - permissionFlag: true, - amount: constants.MaxUint256, - weight: BigNumber.from(10) - .pow(18) - .mul(1), - weightedAmount: constants.MaxUint256.div(2) - }) - }, - { - description: "with preprinted amount", - fn: () => ({ - prePrintAmount: BigNumber.from(10) - .pow(18) - .mul(42), - weightedPrePrintAmount: BigNumber.from(10) - .pow(18) - .mul(210) - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - owner: addrs[0].address, - permissionFlag: false, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "with tickets", - fn: () => ({ - weightedPrePrintAmount: BigNumber.from(42), - revert: "TerminalV1::printTickets: ALREADY_ACTIVE" - }) - } - ] -}; - -const mockFn = ({ - condition, - mockContract, - fn, - args = [], - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - await mockContract.mock[fn] - .withArgs(...normalizedArgs) - .returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - await Promise.all( - events.map(async event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ) - ); -}; - -const check = ({ condition, contract, fn, args, value }) => async () => { - if (condition !== undefined && !condition) return; - const storedVal = await contract[fn](...args); - expect(storedVal).to.equal(value); -}; - -const ops = ({ deployer, mockContracts, targetContract }) => custom => { - const { - caller = deployer, - owner = deployer.address, - permissionFlag = false, - beneficiary = deployer.address, - memo = "some-memo", - preferUnstaked = false, - amount = BigNumber.from(10) - .pow(18) - .mul(42), - currency = 0, - prePrintAmount = BigNumber.from(0), - ethPrice = BigNumber.from(10) - .pow(18) - .mul(2), - weight = BigNumber.from(10) - .pow(18) - .mul(10), - weightedAmount = BigNumber.from(10) - .pow(18) - .mul(210), - weightedPrePrintAmount = BigNumber.from(10) - .pow(18) - .mul(0), - projectId = 42, - revert - } = { - ...custom - }; - - return [ - mockFn({ - mockContract: mockContracts.projects, - fn: "ownerOf", - args: [projectId], - returns: [owner] - }), - mockFn({ - mockContract: mockContracts.operatorStore, - fn: "hasPermission", - args: () => { - const expectedPermissionIndex = 2; - return [caller.address, owner, projectId, expectedPermissionIndex]; - }, - returns: [permissionFlag || false] - }), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [0] - }), - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "BASE_WEIGHT", - args: [], - returns: [weight] - }), - mockFn({ - mockContract: mockContracts.prices, - fn: "getETHPriceFor", - args: [currency], - returns: [ethPrice] - }), - ...(prePrintAmount > 0 - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [ - beneficiary, - projectId, - weightedPrePrintAmount, - preferUnstaked - ], - returns: [] - }) - ] - : []), - ...(prePrintAmount > 0 - ? [ - executeFn({ - caller, - contract: targetContract, - fn: "printPreminedTickets", - args: [ - projectId, - prePrintAmount, - currency, - beneficiary, - memo, - preferUnstaked - ] - }) - ] - : []), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [weightedPrePrintAmount] - }), - mockFn({ - condition: !revert, - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [beneficiary, projectId, weightedAmount, preferUnstaked], - returns: [] - }), - executeFn({ - caller, - contract: targetContract, - fn: "printPreminedTickets", - args: [projectId, amount, currency, beneficiary, memo, preferUnstaked], - events: [ - { - name: "PrintPreminedTickets", - args: [projectId, beneficiary, amount, currency, memo, caller.address] - } - ], - revert - }), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [weightedPrePrintAmount.add(weightedAmount)] - }), - ...(!revert - ? [ - check({ - contract: targetContract, - fn: "canPrintPreminedTickets", - args: [projectId], - value: true - }) - ] - : []) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_reserved_tickets.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_reserved_tickets.js deleted file mode 100644 index 757f0e1743..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/print_reserved_tickets.js +++ /dev/null @@ -1,294 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, constants } = require("ethers"); - -const mockFn = ({ - condition, - mockContract, - fn, - args = [], - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - await mockContract.mock[fn] - .withArgs(...normalizedArgs) - .returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - await Promise.all( - events.map(async event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ) - ); -}; - -const tests = { - success: [ - { - description: "with reserved rate", - fn: () => ({}) - }, - { - description: "ID is 0", - fn: () => ({ - fundingCycleId: 0 - }) - }, - { - description: "with mod", - fn: ({ addrs }) => ({ - mod: { - preferUnstaked: false, - percent: 5000, - lockedUntil: 0, - beneficiary: addrs[3].address - }, - expectedReservedAmount: BigNumber.from(10) - .pow(18) - .mul(2), - expectedLeftover: BigNumber.from(10).pow(18) - }) - }, - { - description: "with all mod", - fn: ({ addrs }) => ({ - mod: { - preferUnstaked: false, - percent: 10000, - lockedUntil: 0, - beneficiary: addrs[3].address - }, - expectedReservedAmount: BigNumber.from(10) - .pow(18) - .mul(2), - expectedLeftover: BigNumber.from(0) - }) - }, - { - description: "with no reserved rate", - fn: () => ({ - reservedRate: 0 - }) - } - ], - failure: [ - { - description: "overflow", - fn: () => ({ - totalTickets: BigNumber.from(2).pow(255), - revert: "TerminalV1::printReservedTickets: INT_LIMIT_REACHED" - }) - } - ] -}; - -const ops = ({ - deployer, - addrs, - mockContracts, - targetContract -}) => async custom => { - const { - caller = deployer, - owner = addrs[0].address, - totalTickets = BigNumber.from(10) - .pow(18) - .mul(18), - mod, - reservedRate = 20, // 10% - expectedReservedAmount = BigNumber.from(10) - .pow(18) - .mul(2), - expectedLeftover = BigNumber.from(10) - .pow(18) - .mul(2), - weight = BigNumber.from(10).pow(18), - projectId = 42, - fundingCycleId = 1, - configured = 42, - revert - } = { - ...custom - }; - - // Create a packed metadata value to store the reserved rate. - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add(0); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(0); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(reservedRate); - packedMetadata = packedMetadata.shl(8); - - return [ - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "currentOf", - args: [projectId], - returns: [ - { - configured, - id: fundingCycleId, - projectId, - number: 0, - basedOn: 0, - cycleLimit: 0, - weight, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee: 0, - discountRate: 0, - tapped: 0, - metadata: packedMetadata - } - ] - }), - ...(projectId > 0 - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [totalTickets] - }), - mockFn({ - mockContract: mockContracts.projects, - fn: "ownerOf", - args: [projectId], - returns: [owner] - }), - mockFn({ - mockContract: mockContracts.modStore, - fn: "ticketModsOf", - args: [projectId, configured], - returns: [mod ? [mod] : []] - }), - ...(mod - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [ - mod.beneficiary, - projectId, - expectedReservedAmount.mul(mod.percent).div(10000), - mod.preferUnstaked - ], - returns: [] - }) - ] - : []), - ...(expectedLeftover > 0 - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [owner, projectId, expectedLeftover, false], - returns: [] - }) - ] - : []) - ] - : []), - executeFn({ - caller, - contract: targetContract, - fn: "printReservedTickets", - args: [projectId], - events: [ - ...(mod - ? [ - { - name: "DistributeToTicketMod", - args: [ - fundingCycleId, - projectId, - [ - mod.preferUnstaked, - mod.percent, - mod.lockedUntil, - mod.beneficiary - ], - expectedReservedAmount.mul(mod.percent).div(10000), - caller.address - ] - } - ] - : []), - ...(reservedRate > 0 && fundingCycleId > 0 - ? [ - { - name: "PrintReserveTickets", - args: [ - fundingCycleId, - projectId, - owner, - expectedReservedAmount, - expectedLeftover, - caller.address - ] - } - ] - : []) - ], - revert - }) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = await ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = await ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/redeem.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/redeem.js deleted file mode 100644 index bbd8be61d8..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/redeem.js +++ /dev/null @@ -1,623 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, constants } = require("ethers"); - -const tests = { - success: [ - { - description: "with no tappable", - fn: () => ({}) - }, - { - description: "with no tappable sent by project operator", - fn: ({ addrs }) => ({ - account: addrs[0].address, - projectOperator: true - }) - }, - { - description: "with no tappable sent by wildcard operator", - fn: ({ addrs }) => ({ - account: addrs[0].address, - projectOperator: false, - wildcardOperator: true - }) - }, - { - description: "with no tappable and a bonding curve", - fn: () => ({ - bondingCurveRate: 100 - }) - }, - { - description: "with no tappable and a reserve rate", - fn: () => ({ - amount: BigNumber.from(10) - .pow(18) - .mul(9), - reservedRate: 20 - }) - }, - { - description: "With some tappable", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - amount: BigNumber.from(10) - .pow(18) - .mul(50) - }) - }, - { - description: - "With some tappable and bonding curve of 50%, redeeming 50% of the supply", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - // sub-100% discount rate to make recurring. - discountRate: 1, - bondingCurveRate: 100, - // Half the amount of tickets. - count: BigNumber.from(10) - .pow(18) - .mul(5), - ticketBalance: BigNumber.from(10) - .pow(18) - .mul(5), - ticketTotalSupply: BigNumber.from(10) - .pow(18) - .mul(10), - // rate should be %37.5 - amount: BigNumber.from(10) - .pow(18) - .mul(50) - .mul(375) - .div(1000) - }) - }, - { - description: - "With some tappable and bonding curve of 50%, redeeming 10% of supply", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - // sub-100% discount rate to make recurring. - discountRate: 1, - bondingCurveRate: 100, - // Half the amount of tickets. - count: BigNumber.from(10) - .pow(18) - .mul(1), - ticketBalance: BigNumber.from(10) - .pow(18) - .mul(1), - ticketTotalSupply: BigNumber.from(10) - .pow(18) - .mul(10), - // rate should be %5.5 - amount: BigNumber.from(10) - .pow(18) - .mul(50) - .mul(55) - .div(1000) - }) - }, - { - description: - "With some tappable and bonding curve of 10%, redeeming 50% of supply", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - // sub-100% discount rate to make recurring. - discountRate: 1, - bondingCurveRate: 20, - // Half the amount of tickets. - count: BigNumber.from(10) - .pow(18) - .mul(5), - ticketBalance: BigNumber.from(10) - .pow(18) - .mul(5), - ticketTotalSupply: BigNumber.from(10) - .pow(18) - .mul(10), - // rate should be %27.5 - amount: BigNumber.from(10) - .pow(18) - .mul(50) - .mul(275) - .div(1000) - }) - }, - { - description: - "With some tappable and bonding curve of 10%, redeeming 10% of supply", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - // sub-100% discount rate to make recurring. - discountRate: 1, - bondingCurveRate: 20, - // Half the amount of tickets. - count: BigNumber.from(10) - .pow(18) - .mul(1), - ticketBalance: BigNumber.from(10) - .pow(18) - .mul(1), - ticketTotalSupply: BigNumber.from(10) - .pow(18) - .mul(10), - // rate should be %1.9 - amount: BigNumber.from(10) - .pow(18) - .mul(50) - .mul(19) - .div(1000) - }) - }, - { - description: - "With some tappable and reconfiguration bonding curve of 50%", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - // sub-100% discount rate to make recurring. - discountRate: 1, - // active ballot - currentBallotStateOf: 1, - reconfigutaionBondingCurveRate: 100, - // Half the amount of tickets. - count: BigNumber.from(10) - .pow(18) - .mul(5), - ticketBalance: BigNumber.from(10) - .pow(18) - .mul(5), - ticketTotalSupply: BigNumber.from(10) - .pow(18) - .mul(10), - // rate should be %37.5 - amount: BigNumber.from(10) - .pow(18) - .mul(50) - .mul(375) - .div(1000) - }) - }, - { - description: "With exactly min returned", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - minReturnedWei: BigNumber.from(10) - .pow(18) - .mul(50), - amount: BigNumber.from(10) - .pow(18) - .mul(50) - }) - }, - { - description: "max uints", - fn: () => ({ - count: BigNumber.from(2) - .pow(255) - .sub(1), - ticketBalance: BigNumber.from(2) - .pow(255) - .sub(1), - ticketTotalSupply: BigNumber.from(2) - .pow(255) - .sub(1) - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ addrs }) => ({ - account: addrs[0].address, - projectOperator: false, - wildcardOperator: false, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "zero count", - fn: () => ({ - count: BigNumber.from(0), - revert: "TerminalV1::redeem: NO_OP" - }) - }, - { - description: "zero address", - fn: () => ({ - beneficiary: constants.AddressZero, - revert: "TerminalV1::redeem: ZERO_ADDRESS" - }) - }, - { - description: "insufficient tickets", - fn: () => ({ - count: BigNumber.from(2), - ticketBalance: BigNumber.from(1), - revert: "TerminalV1::claimableOverflow: INSUFFICIENT_TICKETS" - }) - }, - { - description: "no balance to claim", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10).pow(18), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - amount: BigNumber.from(0), - revert: "TerminalV1::redeem: NO_OP" - }) - }, - { - description: "amount less than min returned", - fn: () => ({ - target: BigNumber.from(10) - .pow(18) - .mul(200), - tapped: BigNumber.from(10) - .pow(18) - .mul(100), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(2), - addToBalance: BigNumber.from(10) - .pow(18) - .mul(100), - minReturnedWei: BigNumber.from(10) - .pow(18) - .mul(50) - .add(1), - revert: "TerminalV1::redeem: INADEQUATE" - }) - } - ] -}; - -const mockFn = ({ - condition, - mockContract, - fn, - args = [], - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - await mockContract.mock[fn] - .withArgs(...normalizedArgs) - .returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - await Promise.all( - events.map(async event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ) - ); -}; - -const check = ({ condition, contract, fn, args, value }) => async () => { - if (condition !== undefined && !condition) return; - const storedVal = await contract[fn](...args); - expect(storedVal).to.equal(value); -}; - -const ops = ({ - deployer, - addrs, - mockContracts, - targetContract -}) => async custom => { - const { - caller = deployer, - account = deployer.address, - projectOperator = false, - wildcardOperator = false, - addToBalance = BigNumber.from(10) - .pow(18) - .mul(10), - beneficiary = addrs[0].address, - count = BigNumber.from(10) - .pow(18) - .mul(10), - ticketBalance = BigNumber.from(10) - .pow(18) - .mul(10), - ticketTotalSupply = BigNumber.from(10) - .pow(18) - .mul(10), - ethPrice = BigNumber.from(10) - .pow(18) - .mul(42), - preferUnstaked = false, - amount = BigNumber.from(10) - .pow(18) - .mul(10), - weight = BigNumber.from(10) - .pow(18) - .mul(10), - minReturnedWei = BigNumber.from(0), - reservedRate = 0, - discountRate = 0, - bondingCurveRate = 200, - reconfigutaionBondingCurveRate = 200, - projectId = 42, - fundingCycleId = 1, - currentBallotStateOf = 0, - target = BigNumber.from(10) - .pow(18) - .mul(100), - tapped = BigNumber.from(10) - .pow(18) - .mul(100), - currency = 42, - revert - } = { - ...custom - }; - - // Create a packed metadata value to store the reserved rate. - let packedMetadata = BigNumber.from(0); - packedMetadata = packedMetadata.add(reconfigutaionBondingCurveRate); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(bondingCurveRate); - packedMetadata = packedMetadata.shl(8); - packedMetadata = packedMetadata.add(reservedRate); - packedMetadata = packedMetadata.shl(8); - - const initialBeneficiaryBalance = await deployer.provider.getBalance( - beneficiary - ); - return [ - mockFn({ - mockContract: mockContracts.operatorStore, - fn: "hasPermission", - args: () => { - const expectedPermissionIndex = 3; - return [caller.address, account, projectId, expectedPermissionIndex]; - }, - returns: [projectOperator || false] - }), - mockFn({ - mockContract: mockContracts.operatorStore, - fn: "hasPermission", - args: () => { - const expectedPermissionIndex = 3; - return [caller.address, account, 0, expectedPermissionIndex]; - }, - returns: [wildcardOperator || false] - }), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "balanceOf", - args: [account, projectId], - returns: [ticketBalance] - }), - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "currentOf", - args: [projectId], - returns: [ - { - configured: 0, - cycleLimit: 0, - id: fundingCycleId, - projectId, - number: 0, - basedOn: 0, - weight, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target, - currency, - fee: 0, - discountRate, - tapped, - metadata: packedMetadata - } - ] - }), - mockFn({ - mockContract: mockContracts.prices, - fn: "getETHPriceFor", - args: [currency], - returns: [ethPrice] - }), - executeFn({ - condition: addToBalance > 0, - caller, - contract: targetContract, - fn: "addToBalance", - args: [projectId], - value: addToBalance - }), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "totalSupplyOf", - args: [projectId], - returns: [ticketTotalSupply] - }), - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "redeem", - args: [account, projectId, count, preferUnstaked], - returns: [] - }), - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "currentBallotStateOf", - args: [projectId], - returns: [currentBallotStateOf] - }), - executeFn({ - caller, - contract: targetContract, - fn: "redeem", - args: [ - account, - projectId, - count, - minReturnedWei, - beneficiary, - preferUnstaked - ], - events: [ - { - name: "Redeem", - args: [account, beneficiary, projectId, count, amount, caller.address] - } - ], - revert - }), - check({ - condition: !revert, - contract: targetContract, - fn: "balanceOf", - args: [projectId], - value: addToBalance.sub(amount) - }), - check({ - condition: !revert, - contract: targetContract.provider, - fn: "getBalance", - args: [beneficiary], - value: initialBeneficiaryBalance.add(amount) - }) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = await ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = await ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/set_fee.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/set_fee.js deleted file mode 100644 index 99bd4cdb3a..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/set_fee.js +++ /dev/null @@ -1,70 +0,0 @@ -const { - ethers: { BigNumber } -} = require("hardhat"); - -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "set to 100%", - fn: ({ governance }) => ({ - caller: governance, - fee: BigNumber.from(200) - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer }) => ({ - caller: deployer, - fee: BigNumber.from(200), - revert: "TerminalV1: UNAUTHORIZED" - }) - }, - { - description: "over 100%", - fn: ({ governance }) => ({ - caller: governance, - fee: BigNumber.from(201), - revert: "TerminalV1::setFee: BAD_FEE" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { caller, fee } = successTest.fn(this); - - // Execute the transaction. - const tx = await this.targetContract.connect(caller).setFee(fee); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.targetContract, "SetFee") - .withArgs(fee); - - // Get the stored fee value. - const storedFee = await this.targetContract.fee(); - - // Expect the stored value to equal whats expected. - expect(storedFee).to.equal(fee); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { caller, fee, revert } = failureTest.fn(this); - - await expect( - this.targetContract.connect(caller).setFee(fee) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/tap.js b/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/tap.js deleted file mode 100644 index a9e1f0caa9..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/behaviors/tap.js +++ /dev/null @@ -1,687 +0,0 @@ -const { expect } = require("chai"); -const { BigNumber, constants, utils } = require("ethers"); - -const mockFn = ({ - condition, - mockContract, - fn, - args, - returns = [] -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = - args && typeof args === "function" ? await args() : args; - const normalizedReturns = - typeof returns === "function" ? await returns() : returns; - const mock = mockContract.mock[fn]; - if (normalizedArgs) mock.withArgs(...normalizedArgs); - await mock.returns(...normalizedReturns); -}; - -const executeFn = ({ - condition, - caller, - contract, - fn, - args = [], - value = 0, - events = [], - revert -}) => async () => { - if (condition !== undefined && !condition) return; - const normalizedArgs = typeof args === "function" ? await args() : args; - const promise = contract.connect(caller)[fn](...normalizedArgs, { value }); - if (revert) { - await expect(promise).to.be.revertedWith(revert); - return; - } - if (events.length === 0) { - await promise; - return; - } - const tx = await promise; - await tx.wait(); - await Promise.all( - events.map(async event => - expect(tx) - .to.emit(contract, event.name) - .withArgs(...event.args) - ) - ); -}; - -const check = ({ condition, contract, fn, args, value }) => async () => { - if (condition !== undefined && !condition) return; - const storedVal = await contract[fn](...args); - expect(storedVal).to.equal(value); -}; - -const tests = { - success: [ - { - description: "with no balance", - fn: () => ({}) - }, - { - description: "with fee, gov uses same terminal", - fn: () => ({ - fee: 20, - tapped: BigNumber.from(10) - .pow(18) - .mul(20), - leftover: BigNumber.from(10) - .pow(18) - .mul(20), - feeAmount: BigNumber.from(10) - .pow(18) - .mul(2), - govUsesSameTerminal: true - }) - }, - { - description: "with fee, gov uses different terminal", - fn: () => ({ - fee: 20, - tapped: BigNumber.from(10) - .pow(18) - .mul(20), - leftover: BigNumber.from(10) - .pow(18) - .mul(20), - feeAmount: BigNumber.from(10) - .pow(18) - .mul(2), - govUsesSameTerminal: false - }) - }, - { - description: "with project mod using different terminal", - fn: async ({ - addrs, - mockContracts, - governance, - contractName, - deployMockLocalContractFn - }) => { - const terminal = await deployMockLocalContractFn(contractName, [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]); - return { - projectMod: { - allocator: constants.AddressZero, - projectId: 1212, - beneficiary: addrs[0].address, - percent: 5000, - preferUnstaked: false, - lockedUntil: 0, - terminal - }, - leftover: BigNumber.from(10) - .pow(18) - .mul(11) - }; - } - }, - { - description: "with all mods", - fn: async ({ addrs, deployMockLocalContractFn }) => { - const allocator = await deployMockLocalContractFn( - "ExampleModAllocator" - ); - - return { - projectMod: { - allocator: constants.AddressZero, - projectId: 1212, - beneficiary: addrs[0].address, - percent: 3000, - preferUnstaked: false, - lockedUntil: 0 - }, - addressMod: { - allocator: constants.AddressZero, - projectId: 0, - beneficiary: addrs[7].address, - percent: 2000, - preferUnstaked: false, - lockedUntil: 0 - }, - allocatorMod: { - allocator, - projectId: 9, - beneficiary: addrs[3].address, - percent: 2500, - preferUnstaked: false, - lockedUntil: 0 - }, - leftover: BigNumber.from(10) - .pow(18) - .mul(22) - .div(4) - }; - } - }, - { - description: "with mod", - fn: async ({ addrs }) => { - return { - projectMod: { - allocator: constants.AddressZero, - projectId: 1212, - beneficiary: addrs[0].address, - percent: 10000, - preferUnstaked: false, - lockedUntil: 0 - }, - leftover: BigNumber.from(0) - }; - } - } - ], - failure: [ - { - description: "unexpected currency", - fn: () => ({ - currency: 19, - revert: "TerminalV1::tap: UNEXPECTED_CURRENCY" - }) - }, - { - description: "insufficient funds", - fn: () => ({ - addToBalance: BigNumber.from(10) - .pow(18) - .mul(1), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(1), - amount: BigNumber.from(10) - .pow(18) - .mul(1) - .add(1), - revert: "TerminalV1::tap: INSUFFICIENT_FUNDS" - }) - }, - { - description: "inadequate amount", - fn: () => ({ - amount: BigNumber.from(10) - .pow(18) - .mul(1), - ethPrice: BigNumber.from(10) - .pow(18) - .mul(1), - minReturnedWei: BigNumber.from(10) - .pow(18) - .mul(1) - .add(1), - revert: "TerminalV1::tap: INADEQUATE" - }) - }, - { - description: "bad mod project", - fn: async ({ addrs }) => ({ - projectMod: { - allocator: constants.AddressZero, - projectId: 1212, - beneficiary: addrs[0].address, - percent: 150, - preferUnstaked: false, - lockedUntil: 0, - terminal: { address: constants.AddressZero } - }, - revert: "TerminalV1::tap: BAD_MOD" - }) - } - ] -}; - -const ops = ({ - deployer, - addrs, - mockContracts, - deployMockLocalContractFn, - deployContractFn, - contractName -}) => async custom => { - const { - caller = deployer, - owner = addrs[0].address, - addToBalance = BigNumber.from(10) - .pow(18) - .mul(44), - amount = BigNumber.from(10) - .pow(18) - .mul(44), - ethPrice = BigNumber.from(10) - .pow(18) - .mul(2), - tapped = BigNumber.from(10) - .pow(18) - .mul(22), - leftover = BigNumber.from(10) - .pow(18) - .mul(22), - projectMod, - addressMod, - allocatorMod, - minReturnedWei = BigNumber.from(0), - handle = "some-handle", - govUsesSameTerminal = true, - projectId = 42, - fundingCycleId = 1, - currency = 1, - expectedCurrency = 1, - fee = 0, - configured = 42, - feeAmount = BigNumber.from(0), - govProjectId = 70, - revert - } = { - ...custom - }; - - const mods = []; - const modEvents = []; - if (projectMod) { - mods.push(projectMod); - modEvents.push({ - name: "DistributeToPayoutMod", - args: [ - fundingCycleId, - projectId, - [ - projectMod.preferUnstaked, - projectMod.percent, - projectMod.lockedUntil, - projectMod.beneficiary, - projectMod.allocator, - projectMod.projectId - ], - tapped.mul(projectMod.percent).div(10000), - caller.address - ] - }); - } - if (addressMod) { - modEvents.push({ - name: "DistributeToPayoutMod", - args: [ - fundingCycleId, - projectId, - [ - addressMod.preferUnstaked, - addressMod.percent, - addressMod.lockedUntil, - addressMod.beneficiary, - addressMod.allocator, - addressMod.projectId - ], - tapped.mul(addressMod.percent).div(10000), - caller.address - ] - }); - mods.push(addressMod); - } - let allocator; - if (allocatorMod) { - allocator = allocatorMod.allocator; - allocatorMod.allocator = allocatorMod.allocator.address; - modEvents.push({ - name: "DistributeToPayoutMod", - args: [ - fundingCycleId, - projectId, - [ - allocatorMod.preferUnstaked, - allocatorMod.percent, - allocatorMod.lockedUntil, - allocatorMod.beneficiary, - allocatorMod.allocator, - allocatorMod.projectId - ], - tapped.mul(allocatorMod.percent).div(10000), - caller.address - ] - }); - mods.push(allocatorMod); - } - - // Governance must be a mocked contract here. - const governance = await deployMockLocalContractFn("Governance", [ - govProjectId, - mockContracts.terminalDirectory.address - ]); - const targetContract = await deployContractFn(contractName, [ - mockContracts.projects.address, - mockContracts.fundingCycles.address, - mockContracts.ticketBooth.address, - mockContracts.operatorStore.address, - mockContracts.modStore.address, - mockContracts.prices.address, - mockContracts.terminalDirectory.address, - governance.address - ]); - - return [ - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "tap", - args: [projectId, amount], - returns: [ - { - configured, - id: fundingCycleId, - cycleLimit: 0, - projectId, - number: 0, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: expectedCurrency, - fee, - discountRate: 0, - tapped: 0, - metadata: 0 - } - ] - }), - mockFn({ - mockContract: mockContracts.prices, - fn: "getETHPriceFor", - args: [currency], - returns: [ethPrice] - }), - ...(addToBalance > 0 ? [] : []), - executeFn({ - condition: addToBalance > 0, - caller, - contract: targetContract, - fn: "addToBalance", - args: [projectId], - value: addToBalance - }), - mockFn({ - mockContract: mockContracts.projects, - fn: "ownerOf", - args: [projectId], - returns: [owner] - }), - mockFn({ - mockContract: mockContracts.modStore, - fn: "payoutModsOf", - args: [projectId, configured], - returns: [mods] - }), - ...(fee > 0 - ? [ - mockFn({ - mockContract: governance, - fn: "projectId", - args: [], - returns: [govProjectId] - }), - mockFn({ - mockContract: mockContracts.terminalDirectory, - fn: "terminalOf", - args: [govProjectId], - returns: [ - govUsesSameTerminal - ? targetContract.address - : constants.AddressZero - ] - }), - ...(!govUsesSameTerminal - ? [ - mockFn({ - mockContract: governance, - fn: "pay", - // For some reason, the bytes to string doesnt match. - // args: [owner, "Juicebox fee", false], - returns: [] - }) - ] - : []), - ...(govUsesSameTerminal - ? [ - mockFn({ - mockContract: mockContracts.fundingCycles, - fn: "currentOf", - args: [govProjectId], - returns: [ - { - metadata: 0, - cycleLimit: 0, - configured: 0, - id: 1, - projectId: 0, - number: 1, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee, - discountRate: 0, - tapped: 0 - } - ] - }), - mockFn({ - condition: govUsesSameTerminal, - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [owner, govProjectId, 0, false], - returns: [] - }) - ] - : []) - ] - : []), - mockFn({ - mockContract: mockContracts.projects, - fn: "handleOf", - args: [projectId], - returns: [utils.formatBytes32String(handle)] - }), - ...(allocatorMod - ? [ - mockFn({ - mockContract: allocator, - fn: "allocate", - args: [projectId, allocatorMod.projectId, allocatorMod.beneficiary], - returns: [] - }) - ] - : []), - ...(projectMod - ? [ - mockFn({ - mockContract: mockContracts.terminalDirectory, - fn: "terminalOf", - args: [projectMod.projectId], - returns: [ - (projectMod.terminal && projectMod.terminal.address) || - targetContract.address - ] - }), - ...(!revert && projectMod.terminal !== undefined - ? [ - mockFn({ - mockContract: projectMod.terminal, - fn: "pay", - // For some reason, the bytes to string doesnt match. - // args: [ - // projectMod.projectId, - // projectMod.beneficiary, - // `Payment from @${handle}`, - // projectMod.preferUnstaked - // ], - returns: [1] - }) - ] - : []), - ...(projectMod.terminal === undefined - ? [ - mockFn({ - condition: projectMod.terminal === undefined, - mockContract: mockContracts.fundingCycles, - fn: "currentOf", - args: [projectMod.projectId], - returns: [ - { - metadata: 0, - cycleLimit: 0, - configured: 0, - id: 1, - projectId: 0, - number: 1, - basedOn: 0, - weight: 0, - ballot: constants.AddressZero, - start: 0, - duration: 0, - target: 0, - currency: 0, - fee, - discountRate: 0, - tapped: 0 - } - ] - }) - ] - : []), - ...(projectMod.terminal === undefined - ? [ - mockFn({ - mockContract: mockContracts.ticketBooth, - fn: "print", - args: [ - projectMod.beneficiary, - projectMod.projectId, - 0, - projectMod.preferUnstaked - ], - returns: [] - }) - ] - : []) - ] - : []), - mockFn({ - mockContract: governance, - fn: "pay", - // For some reason, the bytes to string doesnt match. - // args: [owner, "Juicebox fee", false], - returns: [] - }), - executeFn({ - caller, - contract: targetContract, - fn: "tap", - args: [projectId, amount, currency, minReturnedWei], - events: [ - ...modEvents, - { - name: "Tap", - args: [ - fundingCycleId, - projectId, - owner, - amount, - currency, - tapped, - leftover, - feeAmount, - caller.address - ] - } - ], - revert - }), - ...(!revert - ? [ - check({ - condition: !revert, - contract: caller.provider, - fn: "getBalance", - args: [owner], - value: (await caller.provider.getBalance(owner)).add(leftover) - }) - ] - : []), - ...(!revert && projectMod && projectMod.terminal === undefined - ? [ - check({ - contract: targetContract, - fn: "balanceOf", - args: [projectMod.projectId], - value: tapped.mul(projectMod.percent).div(10000) - }) - ] - : []), - ...(!revert && addressMod - ? [ - check({ - contract: caller.provider, - fn: "getBalance", - args: [addressMod.beneficiary], - value: ( - await caller.provider.getBalance(addressMod.beneficiary) - ).add(tapped.mul(addressMod.percent).div(10000)) - }) - ] - : []), - ...(!revert && allocatorMod - ? [ - check({ - contract: caller.provider, - fn: "getBalance", - args: [allocatorMod.allocator], - value: ( - await caller.provider.getBalance(allocatorMod.allocator) - ).add(tapped.mul(allocatorMod.percent).div(10000)) - }) - ] - : []) - ]; -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const resolvedOps = await ops(this)(await successTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const resolvedOps = await ops(this)(await failureTest.fn(this)); - // eslint-disable-next-line no-restricted-syntax - for (const op of resolvedOps) { - // eslint-disable-next-line no-await-in-loop - await op(); - } - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/terminal_v1/index.js b/packages/hardhat/test/unit/behaviors/terminal_v1/index.js deleted file mode 100644 index fbd6decd89..0000000000 --- a/packages/hardhat/test/unit/behaviors/terminal_v1/index.js +++ /dev/null @@ -1,74 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "TerminalV1"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - const operatorStore = await this.deployMockLocalContractFn("OperatorStore"); - const projects = await this.deployMockLocalContractFn("Projects", [ - operatorStore.address - ]); - const prices = await this.deployMockLocalContractFn("Prices"); - const terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory", - [projects.address, operatorStore.address] - ); - const fundingCycles = await this.deployMockLocalContractFn( - "FundingCycles", - [terminalDirectory.address] - ); - const ticketBooth = await this.deployMockLocalContractFn("TicketBooth", [ - projects.address, - operatorStore.address, - terminalDirectory.address - ]); - const modStore = await this.deployMockLocalContractFn("ModStore", [ - projects.address, - operatorStore.address - ]); - - const governance = this.addrs[9]; - - this.governance = governance; - - this.mockContracts = { - operatorStore, - projects, - prices, - terminalDirectory, - fundingCycles, - ticketBooth, - modStore - }; - - this.targetContract = await this.deployContractFn(contractName, [ - projects.address, - fundingCycles.address, - ticketBooth.address, - operatorStore.address, - modStore.address, - prices.address, - terminalDirectory.address, - governance.address - ]); - - this.contractName = contractName; - }); - - // Test each function. - describe("appointGovernance(...)", shouldBehaveLike.appointGovernance); - describe("acceptGovernance(...)", shouldBehaveLike.acceptGovernance); - describe("setFee(...)", shouldBehaveLike.setFee); - describe("allowMigration(...)", shouldBehaveLike.allowMigration); - describe("addToBalance(...)", shouldBehaveLike.addToBalance); - describe("migrate(...)", shouldBehaveLike.migrate); - describe("deploy(...)", shouldBehaveLike.deploy); - describe("configure(...)", shouldBehaveLike.configure); - describe("pay(...)", shouldBehaveLike.pay); - describe("printPremineTickets(...)", shouldBehaveLike.printPreminedTickets); - describe("redeem(...)", shouldBehaveLike.redeem); - describe("tap(...)", shouldBehaveLike.tap); - describe("printReservedTickets(...)", shouldBehaveLike.printReservedTickets); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/balance_of.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/balance_of.js deleted file mode 100644 index 53b12bff3b..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/balance_of.js +++ /dev/null @@ -1,170 +0,0 @@ -// const { ethers } = require("hardhat"); -const { expect } = require("chai"); -const { - ethers: { BigNumber } -} = require("hardhat"); - -const tests = { - success: [ - { - description: "total balance of, just staked tickets", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - issue: false, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - } - ], - balances: [ - { - holder: deployer.address, - expected: BigNumber.from(50) - } - ] - }) - }, - { - description: "total balance of, staked and unstaked tickets", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - issue: true, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "ERC20", - holder: deployer.address, - amount: BigNumber.from(50) - } - ], - balances: [ - { - holder: deployer.address, - expected: BigNumber.from(100) - } - ] - }) - }, - { - description: - "total balance of, staked and unstaked tickets with some transfered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - issue: true, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "ERC20", - holder: deployer.address, - amount: BigNumber.from(50) - } - ], - transfer: { - holder: deployer.address, - amount: BigNumber.from(30), - recipient: addrs[0].address - }, - balances: [ - { - holder: deployer.address, - expected: BigNumber.from(70) - }, - { - holder: addrs[0].address, - expected: BigNumber.from(30) - } - ] - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - issue, - print, - transfer, - balances - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (issue) { - // Issue tickets. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - } - - await Promise.all( - print.map(async p => { - switch (p.type) { - case "staked": - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(p.holder, projectId, p.amount, false); - break; - case "ERC20": - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(p.holder, projectId, p.amount, true); - break; - default: - break; - } - }) - ); - if (transfer) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .transfer( - transfer.holder, - projectId, - transfer.amount, - transfer.recipient - ); - } - - await Promise.all( - balances.map(async balance => { - // Execute the transaction. - const storedBalanceOf = await this.contract - .connect(caller) - .balanceOf(balance.holder, projectId); - - // The expected should match what's stored. - expect(storedBalanceOf).to.equal(balance.expected); - }) - ); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/index.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/index.js deleted file mode 100644 index f8ce8d0204..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/index.js +++ /dev/null @@ -1,23 +0,0 @@ -const print = require("./print"); -const unstake = require("./unstake"); -const stake = require("./stake"); -const issue = require("./issue"); -const transfer = require("./transfer"); -const redeem = require("./redeem"); -const lock = require("./lock"); -const unlock = require("./unlock"); -const balanceOf = require("./balance_of"); -const totalSupplyOf = require("./total_supply_of"); - -module.exports = { - print, - unstake, - stake, - issue, - transfer, - redeem, - lock, - unlock, - balanceOf, - totalSupplyOf -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/issue.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/issue.js deleted file mode 100644 index c80d2817e6..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/issue.js +++ /dev/null @@ -1,176 +0,0 @@ -const { ethers } = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "issues tickets, called by owner", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - permissionFlag: false - }) - }, - { - description: "issues tickets, called by operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: addrs[0].address, - projectId: 1, - permissionFlag: true - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectOwner: addrs[0].address, - projectId: 1, - permissionFlag: false, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "empty name", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - permissionFlag: false, - useEmptyName: true, - revert: "TicketBooth::issue: EMPTY_NAME" - }) - }, - { - description: "empty symbol", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - permissionFlag: false, - useEmptySymbol: true, - revert: "TicketBooth::issue: EMPTY_SYMBOL" - }) - }, - { - description: "tickets already issued", - fn: ({ deployer }) => ({ - caller: deployer, - projectOwner: deployer.address, - projectId: 1, - permissionFlag: false, - preissue: true, - revert: "TicketBooth::issue: ALREADY_ISSUED" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectOwner, - projectId, - permissionFlag - } = successTest.fn(this); - - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 9; - - // Set the Operator store to return the permission flag. - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - - const name = "doesnt"; - const symbol = "matter"; - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .issue(projectId, name, symbol); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Issue") - .withArgs(projectId, name, symbol, caller.address); - - // Get the stored ticket for the project. - const storedTicketAddress = await this.contract - .connect(caller) - .ticketsOf(projectId); - - // Attach the address to the Tickets contract. - const TicketFactory = await ethers.getContractFactory("Tickets"); - const StoredTicket = await TicketFactory.attach(storedTicketAddress); - - // Get the stored values for the issued tickets. - const storedName = await StoredTicket.name(); - const storedSymbol = await StoredTicket.symbol(); - - // The set values should equal the stored values. - expect(name).to.equal(storedName); - expect(symbol).to.equal(storedSymbol); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - projectOwner, - projectId, - permissionFlag, - preissue, - useEmptyName, - useEmptySymbol, - revert - } = failureTest.fn(this); - - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(projectOwner); - - // Issue tickets ahead of the opertion. - if (preissue) { - await expect( - this.contract.connect(caller).issue(projectId, "doesnt", "matter") - ); - } - - if (permissionFlag !== undefined) { - const permissionIndex = 9; - - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, projectOwner, projectId, permissionIndex) - .returns(permissionFlag); - } - - await expect( - this.contract - .connect(caller) - .issue( - projectId, - useEmptyName ? "" : "doesnt", - useEmptySymbol ? "" : "matter" - ) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/lock.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/lock.js deleted file mode 100644 index 4898d75cb5..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/lock.js +++ /dev/null @@ -1,310 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "with nothing pre locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "with some pre locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(40), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(10) - } - }) - }, - { - description: "with max uints", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "called by personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - setup: { - personalOperator: true, - permissionFlag: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "called by project operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - setup: { - permissionFlag: true, - personalOperator: false, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - holder: addrs[0].address, - projectId: 1, - amount: BigNumber.from(10), - setup: { - permissionFlag: false, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "insufficient funds, non locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(40), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::lock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, some already locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(10) - }, - revert: "TicketBooth::lock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, max uints", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: constants.MaxUint256, - setup: { - setOwner: true, - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256 - }, - revert: "TicketBooth::lock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "amount is 0", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(0), - setup: { - setOwner: true, - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256 - }, - revert: "TicketBooth::lock: NO_OP" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - holder, - projectId, - amount, - setup: { - permissionFlag, - personalOperator, - stakedBalance, - lockedAmount - } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 13; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? projectId : 0, - permissionIndex - ) - .returns(false); - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // If there should be a staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .lock(holder, projectId, amount); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Lock") - .withArgs(holder, projectId, amount, caller.address); - - // Get a reference to the stored amount locked. - const storedLocked = await this.contract - .connect(caller) - .lockedBalanceOf(holder, projectId); - - // The expected locked is the previous locked plus the amount just locked. - const expectedLocked = lockedAmount.add(amount); - - // The stored locked should equal the expected value. - expect(storedLocked).to.equal(expectedLocked); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - holder, - amount, - projectId, - setup: { - permissionFlag, - personalOperator, - stakedBalance, - lockedAmount - }, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 13; - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, projectId, permissionIndex) - .returns(true); - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? projectId : 0, - permissionIndex - ) - .returns(false); - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).lock(holder, projectId, amount) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/print.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/print.js deleted file mode 100644 index a411e8084d..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/print.js +++ /dev/null @@ -1,241 +0,0 @@ -const { - ethers: { BigNumber, constants, getContractFactory } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "prints staked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - withERC20: false - }) - }, - { - description: "prints ERC-20 tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: true, - withERC20: true - }) - }, - { - description: "prints staked tickets if no ERC20 issued", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: true, - withERC20: false - }) - }, - { - description: "prints staked tickets if ERC20 issued but not prefered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - withERC20: true - }) - }, - { - description: "prints staked tickets, max uint", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: constants.MaxUint256, - preferUnstaked: false, - withERC20: false - }) - } - ], - failure: [ - { - description: "overflow", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: constants.MaxUint256, - preferUnstaked: false, - withERC20: false, - setup: { stakedBalance: BigNumber.from(1) }, - revert: "" - }) - }, - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: addrs[0].address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - withERC20: false, - revert: "TerminalUtility: UNAUTHORIZED" - }) - }, - { - description: "amount is 0", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(0), - preferUnstaked: false, - withERC20: false, - revert: "TicketBooth::print: NO_OP" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - holder, - amount, - preferUnstaked, - withERC20 - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Issue ERC-20s if needed. - if (withERC20) { - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .print(holder, projectId, amount, preferUnstaked); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Print") - .withArgs( - holder, - projectId, - amount, - withERC20 && preferUnstaked, - preferUnstaked, - caller.address - ); - - // The expected balance is the amount printed. - const expectedBalance = amount; - // The expected total supply is the amount printed. - const expectedTotalSupply = amount; - - if (withERC20 && preferUnstaked) { - // Get the stored ticket for the project. - const storedTicketAddress = await this.contract - .connect(caller) - .ticketsOf(projectId); - - // Attach the address to the Tickets contract. - const TicketFactory = await getContractFactory("Tickets"); - const StoredTicket = await TicketFactory.attach(storedTicketAddress); - - // Get the stored ticket balance for the holder. - const storedTicketBalance = await StoredTicket.connect( - caller - ).balanceOf(holder); - - // Expect the stored balance to equal the expected value. - expect(storedTicketBalance).to.equal(expectedBalance); - - // Get the stored ticket total supply. - const storedTicketTotalSupply = await StoredTicket.connect( - caller - ).totalSupply(); - - // Expect the stored total supply to equal the expected value. - expect(storedTicketTotalSupply).to.equal(expectedTotalSupply); - } else { - // Get the stored project staked balance for the holder. - const storedStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(holder, projectId); - - // Expect the stored staked balance to equal the expected value. - expect(storedStakedBalance).to.equal(expectedBalance); - - // Get the stored project staked total supply for the holder. - const storedStakedTotalSupply = await this.contract - .connect(caller) - .stakedTotalSupplyOf(projectId); - - // Expect the stored staked total supply to equal the expected value. - expect(storedStakedTotalSupply).to.equal(expectedTotalSupply); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectId, - holder, - amount, - preferUnstaked, - setup: { stakedBalance = 0 } = {}, - revert - } = failureTest.fn(this); - // Mock the controller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - if (stakedBalance > 0) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - - await expect( - this.contract - .connect(caller) - .print(holder, projectId, amount, preferUnstaked) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/redeem.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/redeem.js deleted file mode 100644 index aed4dd90d5..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/redeem.js +++ /dev/null @@ -1,499 +0,0 @@ -// const { ethers } = require("hardhat"); -const { expect } = require("chai"); -const { - ethers: { BigNumber, constants, getContractFactory } -} = require("hardhat"); - -const tests = { - success: [ - { - description: "redeems staked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(50), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "redeems ERC-20 tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(0), - erc20Balance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "redeems mix of staked and unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(20), - erc20Balance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: - "redeems mix of staked and unstaked tickets, prefering ERC-20s", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: true, - setup: { - stakedBalance: BigNumber.from(20), - erc20Balance: BigNumber.from(40), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "redeems only ERC-20 tickets, prefering ERC-20s", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: true, - setup: { - stakedBalance: BigNumber.from(20), - erc20Balance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "redeems only staked tickets, prefering unstaked", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: true, - setup: { - stakedBalance: BigNumber.from(50), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "redeems mix of staked and unstaked tickets, max uints", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: constants.MaxUint256, - preferUnstaked: false, - setup: { - stakedBalance: constants.MaxUint256, - erc20Balance: constants.MaxUint256, - lockedAmount: 0 - } - }) - }, - { - description: - "redeems mix of staked and unstaked tickets, max uints including locked", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: constants.MaxUint256, - preferUnstaked: false, - setup: { - stakedBalance: constants.MaxUint256, - erc20Balance: constants.MaxUint256, - lockedAmount: constants.MaxUint256 - } - }) - }, - { - description: "redeems mix of staked and unstaked tickets, some locked", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(20), - erc20Balance: BigNumber.from(50), - lockedAmount: BigNumber.from(20) - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: addrs[0], - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(50), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(0) - }, - revert: "TerminalUtility: UNAUTHORIZED" - }) - }, - { - description: "insufficient funds with no staked or unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(0), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds with staked but no unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(30), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - }, - { - description: - "insufficient funds with staked tickets but not enough unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(30), - erc20Balance: BigNumber.from(10), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - }, - { - description: - "insufficient funds with no staked tickets and not enough unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(0), - erc20Balance: BigNumber.from(10), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds with staked tickets but locked", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(50), - erc20Balance: BigNumber.from(0), - lockedAmount: BigNumber.from(20) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - }, - { - description: - "insufficient funds with staked and unstaked tickets but locked", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - controller: deployer.address, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - preferUnstaked: false, - setup: { - stakedBalance: BigNumber.from(50), - erc20Balance: BigNumber.from(10), - lockedAmount: BigNumber.from(20) - }, - revert: "TicketBooth::redeem: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - holder, - amount, - preferUnstaked, - setup: { stakedBalance, erc20Balance, lockedAmount } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance > 0) { - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - // Add to the erc20 balance if needed. - if (erc20Balance > 0) { - // Issue tickets. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(holder, projectId, erc20Balance, true); - } - if (lockedAmount > 0) { - const permissionIndex = 13; - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, projectId, permissionIndex) - .returns(true); - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .redeem(holder, projectId, amount, preferUnstaked); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Redeem") - .withArgs( - holder, - projectId, - amount, - stakedBalance.sub - ? stakedBalance.sub(lockedAmount) - : stakedBalance - lockedAmount, - preferUnstaked, - caller.address - ); - - // The expected total staked supply. - let expectedStakedTotalSupply; - if (preferUnstaked && erc20Balance > 0) { - expectedStakedTotalSupply = stakedBalance.sub( - amount > erc20Balance ? amount.sub(erc20Balance) : BigNumber.from(0) - ); - } else { - expectedStakedTotalSupply = - stakedBalance.sub(amount) > lockedAmount - ? stakedBalance.sub(amount) - : lockedAmount; - } - - // Get the stored staked supply. - const storedStakedTotalSupply = await this.contract - .connect(caller) - .stakedTotalSupplyOf(projectId); - - // The expected should match what's stored. - expect(storedStakedTotalSupply).to.equal(expectedStakedTotalSupply); - - // The expected balance of the holder. - const expectedStakedBalance = expectedStakedTotalSupply; - - // Get the stored staked supply. - const storedStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(holder, projectId); - - // The expected should match what's stored. - expect(storedStakedBalance).to.equal(expectedStakedBalance); - - // Get the stored lcoked amount. - const storedLocked = await this.contract - .connect(caller) - .lockedBalanceOf(holder, projectId); - - // Locked shouldn't change. - expect(storedLocked).to.equal(lockedAmount); - - if (erc20Balance > 0) { - // Get the stored tickets. - const storedTicketAddress = await this.contract - .connect(caller) - .ticketsOf(projectId); - - // Attach the address to the Tickets contract. - const TicketFactory = await getContractFactory("Tickets"); - const StoredTicket = await TicketFactory.attach(storedTicketAddress); - // Get the stored ticket balance for the holder. - const storedTicketBalance = await StoredTicket.connect( - caller - ).balanceOf(holder); - - let expectedTicketBalance; - if (preferUnstaked) { - expectedTicketBalance = - erc20Balance > amount ? erc20Balance.sub(amount) : 0; - } else { - expectedTicketBalance = erc20Balance.sub( - amount > stakedBalance.sub(lockedAmount) - ? amount.sub(stakedBalance.sub(lockedAmount)) - : 0 - ); - } - - // Expect the stored balance to equal the expected. - expect(storedTicketBalance).to.equal(expectedTicketBalance); - // Get the stored ticket total supply. - const storedTicketTotalSupply = await StoredTicket.connect( - caller - ).totalSupply(); - - // Expect the stored total supply to equal the expected value. - expect(storedTicketTotalSupply).to.equal(expectedTicketBalance); - } - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - controller, - projectId, - holder, - amount, - preferUnstaked, - setup: { stakedBalance, erc20Balance, lockedAmount }, - revert - } = failureTest.fn(this); - - // Caller must the controller to setup. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance > 0) { - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - // Add to the erc20 balance if needed. - if (erc20Balance > 0) { - // Issue tickets. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(holder, projectId, erc20Balance, true); - } - if (lockedAmount > 0) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 13; - - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, projectId, permissionIndex) - .returns(true); - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(controller); - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .redeem(holder, projectId, amount, preferUnstaked) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/stake.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/stake.js deleted file mode 100644 index a5decaba22..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/stake.js +++ /dev/null @@ -1,307 +0,0 @@ -const { - ethers: { BigNumber, constants, getContractFactory } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "called by holder", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - erc20Balance: BigNumber.from(50) - } - }) - }, - { - description: "with leftovers", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - erc20Balance: BigNumber.from(150) - } - }) - }, - { - description: "max uints", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: constants.MaxUint256, - setup: { - erc20Balance: constants.MaxUint256 - } - }) - }, - { - description: "called by personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - personalOperator: true, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: true, - setup: { erc20Balance: BigNumber.from(50) } - }) - }, - { - description: "called by non personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - personalOperator: false, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: true, - setup: { erc20Balance: BigNumber.from(50) } - }) - } - ], - failure: [ - { - description: "overflow", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(2), - setup: { - stakedBalance: constants.MaxUint256.sub(1), - erc20Balance: BigNumber.from(2), - issue: true - }, - revert: "" - }) - }, - { - description: "tickets not yet issued", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - erc20Balance: BigNumber.from(50), - issue: false - }, - revert: "TicketBooth::stake: NOT_FOUND" - }) - }, - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: false, - setup: { - erc20Balance: BigNumber.from(50), - issue: true - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "insufficient balance", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(500), - setup: { - erc20Balance: BigNumber.from(50), - issue: true - }, - revert: "TicketBooth::stake: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - personalOperator, - projectId, - holder, - amount, - permissionFlag, - setup: { erc20Balance } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Issue ERC-20s. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 10; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - if (!personalOperator) { - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, 0, permissionIndex) - .returns(false); - } - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, projectId, permissionIndex) - .returns(permissionFlag); - } - - if (erc20Balance > 0) { - await this.contract - .connect(caller) - .print(holder, projectId, erc20Balance, true); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .stake(holder, projectId, amount); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Stake") - .withArgs(holder, projectId, amount, caller.address); - - // Get the stored project's staked balance for the holder. - const storedStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(holder, projectId); - - // Expect the stored staked balance to equal the expected value. - expect(storedStakedBalance).to.equal(amount); - - // The expected total supply is the same as the balance. - const expectedStakedTotalSupply = amount; - - // Get the stored project's staked total supply for the holder. - const storedStakedTotalSupply = await this.contract - .connect(caller) - .stakedTotalSupplyOf(projectId); - - // Expect the stored staked total supply to equal the expected value. - expect(storedStakedTotalSupply).to.equal(expectedStakedTotalSupply); - - // Get the stored ticket for the project. - const storedTicketAddress = await this.contract - .connect(caller) - .ticketsOf(projectId); - - // Attach the address to the Tickets contract. - const TicketFactory = await getContractFactory("Tickets"); - const StoredTicket = await TicketFactory.attach(storedTicketAddress); - - // Get the stored ticket balance for the holder. - const storedTicketBalance = await StoredTicket.connect( - caller - ).balanceOf(holder); - - // There should now be a balance of tickets for the holder. - expect(storedTicketBalance).to.equal(erc20Balance.sub(amount)); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - personalOperator, - projectId, - holder, - amount, - permissionFlag, - setup: { stakedBalance = BigNumber.from(0), erc20Balance, issue }, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Issue ERC-20s if needed. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - - // Issue tickets ahead of the opertion. - if (issue) { - await expect( - this.contract.connect(caller).issue(projectId, "doesnt", "matter") - ); - } - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 10; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - if (!personalOperator) { - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, 0, permissionIndex) - .returns(false); - } - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // These were sporadically given a "run out of gas" error, so the limit was icreased. - if (stakedBalance > 0) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false, { - gasLimit: 100000 - }); - } - if (erc20Balance) { - await this.contract - .connect(caller) - .print(holder, projectId, erc20Balance, true, { - gasLimit: 100000 - }); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).stake(holder, projectId, amount) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/total_supply_of.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/total_supply_of.js deleted file mode 100644 index 91b266192d..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/total_supply_of.js +++ /dev/null @@ -1,157 +0,0 @@ -// const { ethers } = require("hardhat"); -const { expect } = require("chai"); -const { - ethers: { BigNumber } -} = require("hardhat"); - -const tests = { - success: [ - { - description: "total supply, just staked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - issue: false, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "staked", - holder: addrs[0].address, - amount: BigNumber.from(50) - } - ], - totalSupply: BigNumber.from(100) - }) - }, - { - description: "total supply, staked and unstaked tickets", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - issue: true, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "ERC20", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "ERC20", - holder: addrs[0].address, - amount: BigNumber.from(50) - } - ], - totalSupply: BigNumber.from(150) - }) - }, - { - description: - "total supply, staked and unstaked tickets with some transfered", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - issue: true, - print: [ - { - type: "staked", - holder: deployer.address, - amount: BigNumber.from(50) - }, - { - type: "ERC20", - holder: deployer.address, - amount: BigNumber.from(50) - } - ], - transfer: { - holder: deployer.address, - amount: BigNumber.from(30), - recipient: addrs[0].address - }, - totalSupply: BigNumber.from(100) - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - issue, - print, - transfer, - totalSupply - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (issue) { - // Issue tickets. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - } - - await Promise.all( - print.map(async p => { - switch (p.type) { - case "staked": - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(p.holder, projectId, p.amount, false); - break; - case "ERC20": - // Print tickets to make up the balance. - await this.contract - .connect(caller) - .print(p.holder, projectId, p.amount, true); - break; - default: - break; - } - }) - ); - if (transfer) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .transfer( - transfer.holder, - projectId, - transfer.amount, - transfer.recipient - ); - } - - // Execute the transaction. - const storedTotalSupply = await this.contract - .connect(caller) - .totalSupplyOf(projectId); - - // The expected should match what's stored. - expect(storedTotalSupply).to.equal(totalSupply); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/transfer.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/transfer.js deleted file mode 100644 index efce222799..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/transfer.js +++ /dev/null @@ -1,345 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "called by holder", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "called by personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - recipient: addrs[1].address, - amount: BigNumber.from(50), - setup: { - personalOperator: true, - permissionFlag: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "called by project operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - recipient: addrs[1].address, - amount: BigNumber.from(50), - setup: { - personalOperator: false, - permissionFlag: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "with locked amount", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: BigNumber.from(10), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(40) - } - }) - }, - { - description: "with max uints", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: 0 - } - }) - } - ], - failure: [ - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - recipient: addrs[1].address, - amount: BigNumber.from(50), - setup: { - permissionFlag: false, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "zero address", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: constants.AddressZero, - amount: BigNumber.from(50), - revert: "TicketBooth::transfer: ZERO_ADDRESS" - }) - }, - { - description: "sender is recipient", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: deployer.address, - amount: BigNumber.from(50), - revert: "TicketBooth::transfer: IDENTITY" - }) - }, - { - description: "zero amount", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: BigNumber.from(0), - revert: "TicketBooth::transfer: NO_OP" - }) - }, - { - description: "insufficient funds", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: BigNumber.from(51), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::transfer: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, with lock", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: BigNumber.from(20), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(40) - }, - revert: "TicketBooth::transfer: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, with max uint lock", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - recipient: addrs[0].address, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256 - }, - revert: "TicketBooth::transfer: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - projectId, - holder, - amount, - recipient, - setup: { - stakedBalance, - lockedAmount, - personalOperator, - permissionFlag - } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 12; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? projectId : 0, - permissionIndex - ) - .returns(false); - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // If there should be staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .transfer(holder, projectId, amount, recipient); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Transfer") - .withArgs(holder, projectId, recipient, amount, caller.address); - - // The expected sender balance is the previous balance minus the amount transfered. - const expectedSenderStakedBalance = stakedBalance.sub(amount); - - // Get the stored project's staked balance for the holder. - const storedSenderStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(holder, projectId); - - // Expect the stored project's staked balance to equal the expected value. - expect(storedSenderStakedBalance).to.equal(expectedSenderStakedBalance); - - // The expected reciever balance is the transfered amount. - const expectedRecipientStakedBalance = amount; - - // Get the stored project's staked balance for the receiver. - const storedRecipientStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(recipient, projectId); - - // Expect the stored staked balance to equal the expected value. - expect(storedRecipientStakedBalance).to.equal( - expectedRecipientStakedBalance - ); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - personalOperator, - projectId, - holder, - amount, - recipient, - setup: { permissionFlag, stakedBalance, lockedAmount } = {}, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 12; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? projectId : 0, - permissionIndex - ) - .returns(false); - - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - await expect( - this.contract - .connect(caller) - .transfer(holder, projectId, amount, recipient) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unlock.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unlock.js deleted file mode 100644 index bdc477febd..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unlock.js +++ /dev/null @@ -1,222 +0,0 @@ -const { - ethers: { BigNumber, constants } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "unlock all", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(50) - } - }) - }, - { - description: "unlock some", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(40), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(50) - } - }) - }, - { - description: "unlock with max uints", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256 - } - }) - } - ], - failure: [ - { - description: "insufficient funds, none locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::unlock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, some locked", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(50), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(40), - lockedBy: deployer - }, - revert: "TicketBooth::unlock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient funds, max uints", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: constants.MaxUint256, - setup: { - setOwner: true, - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256.sub(BigNumber.from(1)), - lockedBy: deployer - }, - revert: "TicketBooth::unlock: INSUFFICIENT_FUNDS" - }) - }, - { - description: "amount is 0", - fn: ({ deployer }) => ({ - caller: deployer, - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(0), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - }, - revert: "TicketBooth::unlock: NO_OP" - }) - }, - { - description: "unlocked by wrong operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - unlocker: addrs[0], - holder: deployer.address, - projectId: 1, - amount: BigNumber.from(40), - setup: { - setOwner: true, - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(40) - }, - revert: "TicketBooth::unlock: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - holder, - projectId, - amount, - setup: { stakedBalance, lockedAmount } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (stakedBalance > 0) { - // Add to the ticket balance so that they can be locked. - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .unlock(holder, projectId, amount); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Unlock") - .withArgs(holder, projectId, amount, caller.address); - - // Get a reference to the stored amount locked. - const storedLocked = await this.contract - .connect(caller) - .lockedBalanceOf(holder, projectId); - - // The expected locked is the previous locked plus the amount just locked. - const expectedLocked = lockedAmount.sub(amount); - - // The stored locked should equal the expected value. - expect(storedLocked).to.equal(expectedLocked); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - unlocker, - holder, - amount, - projectId, - setup: { stakedBalance, lockedAmount }, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - if (stakedBalance > 0) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - await expect( - this.contract - .connect(unlocker || caller) - .unlock(holder, projectId, amount) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unstake.js b/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unstake.js deleted file mode 100644 index d6cbcd1d82..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/behaviors/unstake.js +++ /dev/null @@ -1,381 +0,0 @@ -const { - ethers: { BigNumber, constants, getContractFactory } -} = require("hardhat"); -const { expect } = require("chai"); - -const tests = { - success: [ - { - description: "called by holder", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "with leftovers", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(150), - lockedAmount: BigNumber.from(0) - } - }) - }, - { - description: "with leftovers and lock", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(150), - lockedAmount: BigNumber.from(50) - } - }) - }, - { - description: "uses all tickets up to lock", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(150), - lockedAmount: BigNumber.from(100) - } - }) - }, - { - description: "max uints", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: 0 - } - }) - }, - { - description: "called by personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - personalOperator: true, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: true, - setup: { stakedBalance: BigNumber.from(50) } - }) - }, - { - description: "called by non personal operator", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - personalOperator: false, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: true, - setup: { stakedBalance: BigNumber.from(50) } - }) - } - ], - failure: [ - { - description: "overflow", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(2), - setup: { - stakedBalance: BigNumber.from(2), - erc20Balance: constants.MaxUint256.sub(1), - issue: true - }, - revert: "" - }) - }, - { - description: "tickets not yet issued", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(50), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0), - issue: false - }, - revert: "TicketBooth::unstake: NOT_FOUND" - }) - }, - { - description: "unauthorized", - fn: ({ deployer, addrs }) => ({ - caller: deployer, - projectId: 1, - holder: addrs[0].address, - amount: BigNumber.from(50), - permissionFlag: false, - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0), - issue: true - }, - revert: "Operatable: UNAUTHORIZED" - }) - }, - { - description: "insufficient balance", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(500), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(0), - issue: true - }, - revert: "TicketBooth::unstake: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient balance due to lock", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: BigNumber.from(10), - setup: { - stakedBalance: BigNumber.from(50), - lockedAmount: BigNumber.from(47), - issue: true - }, - revert: "TicketBooth::unstake: INSUFFICIENT_FUNDS" - }) - }, - { - description: "insufficient balance due to lock, max uints", - fn: ({ deployer }) => ({ - caller: deployer, - projectId: 1, - holder: deployer.address, - amount: constants.MaxUint256, - setup: { - stakedBalance: constants.MaxUint256, - lockedAmount: constants.MaxUint256, - issue: true - }, - revert: "TicketBooth::unstake: INSUFFICIENT_FUNDS" - }) - } - ] -}; - -module.exports = function() { - describe("Success cases", function() { - tests.success.forEach(function(successTest) { - it(successTest.description, async function() { - const { - caller, - personalOperator, - projectId, - holder, - amount, - permissionFlag, - setup: { stakedBalance, lockedAmount } - } = successTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Issue ERC-20s if needed. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - await this.contract - .connect(caller) - .issue(projectId, "doesnt", "matter"); - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 11; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - if (!personalOperator) { - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, 0, permissionIndex) - .returns(false); - } - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, projectId, permissionIndex) - .returns(permissionFlag); - } - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - const tx = await this.contract - .connect(caller) - .unstake(holder, projectId, amount); - - // Expect an event to have been emitted. - await expect(tx) - .to.emit(this.contract, "Unstake") - .withArgs(holder, projectId, amount, caller.address); - - // The expected balance is the previous balance minus the amount unstaked. - const expectedStakedBalance = stakedBalance.sub(amount); - - // Get the stored project staked balance for the holder. - const storedStakedBalance = await this.contract - .connect(caller) - .stakedBalanceOf(holder, projectId); - - // Expect the stored staked balance to equal the expected value. - expect(storedStakedBalance).to.equal(expectedStakedBalance); - - // The expected total supply is the same as the balance. - const expectedStakedTotalSupply = expectedStakedBalance; - - // Get the stored project staked total supply for the holder. - const storedStakedTotalSupply = await this.contract - .connect(caller) - .stakedTotalSupplyOf(projectId); - - // Expect the stored staked total supply to equal the expected value. - expect(storedStakedTotalSupply).to.equal(expectedStakedTotalSupply); - - // Get the stored ticket for the project. - const storedTicketAddress = await this.contract - .connect(caller) - .ticketsOf(projectId); - - // Attach the address to the Tickets contract. - const TicketFactory = await getContractFactory("Tickets"); - const StoredTicket = await TicketFactory.attach(storedTicketAddress); - - // Get the stored ticket balance for the holder. - const storedTicketBalance = await StoredTicket.connect( - caller - ).balanceOf(holder); - - // There should now be a balance of tickets for the holder. - expect(storedTicketBalance).to.equal(amount); - }); - }); - }); - describe("Failure cases", function() { - tests.failure.forEach(function(failureTest) { - it(failureTest.description, async function() { - const { - caller, - personalOperator, - projectId, - holder, - amount, - permissionFlag, - setup: { stakedBalance, erc20Balance = 0, lockedAmount, issue }, - revert - } = failureTest.fn(this); - - // Mock the caller to be the project's controller. - await this.terminalDirectory.mock.terminalOf - .withArgs(projectId) - .returns(caller.address); - - // Issue ERC-20s if needed. - // Must make the caller the project owner in order to issue. - await this.projects.mock.ownerOf - .withArgs(projectId) - .returns(caller.address); - - // Issue tickets ahead of the opertion. - if (issue) { - await expect( - this.contract.connect(caller).issue(projectId, "doesnt", "matter") - ); - } - - // If a permission flag is specified, set the mock to return it. - if (permissionFlag !== undefined) { - // Get the permission index needed to set the payout mods on an owner's behalf. - const permissionIndex = 11; - - // Set the Operator store to return the permission flag. - // If setting to a project ID other than 0, the operator should not have permission to the 0th project. - if (!personalOperator) { - await this.operatorStore.mock.hasPermission - .withArgs(caller.address, holder, 0, permissionIndex) - .returns(false); - } - await this.operatorStore.mock.hasPermission - .withArgs( - caller.address, - holder, - personalOperator ? 0 : projectId, - permissionIndex - ) - .returns(permissionFlag); - } - - // If there should be an staked balance set up, print the necessary tickets before issuing a ticket. - if (stakedBalance) { - await this.contract - .connect(caller) - .print(holder, projectId, stakedBalance, false); - } - if (erc20Balance > 0) { - await this.contract - .connect(caller) - .print(holder, projectId, erc20Balance, true); - } - if (lockedAmount > 0) { - // Lock the specified amount of tickets. - await this.contract - .connect(caller) - .lock(holder, projectId, lockedAmount); - } - - // Execute the transaction. - await expect( - this.contract.connect(caller).unstake(holder, projectId, amount) - ).to.be.revertedWith(revert); - }); - }); - }); -}; diff --git a/packages/hardhat/test/unit/behaviors/ticket_booth/index.js b/packages/hardhat/test/unit/behaviors/ticket_booth/index.js deleted file mode 100644 index 03eaeb1846..0000000000 --- a/packages/hardhat/test/unit/behaviors/ticket_booth/index.js +++ /dev/null @@ -1,34 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -const contractName = "TicketBooth"; - -module.exports = function() { - // Before the tests, deploy mocked dependencies and the contract. - before(async function() { - // Deploy mock dependency contracts. - this.projects = await this.deployMockLocalContractFn("Projects"); - this.operatorStore = await this.deployMockLocalContractFn("OperatorStore"); - this.terminalDirectory = await this.deployMockLocalContractFn( - "TerminalDirectory" - ); - - // Deploy the contract. - this.contract = await this.deployContractFn(contractName, [ - this.projects.address, - this.operatorStore.address, - this.terminalDirectory.address - ]); - }); - - // Test each function. - describe("issue(...)", shouldBehaveLike.issue); - describe("print(...)", shouldBehaveLike.print); - describe("unstake(...)", shouldBehaveLike.unstake); - describe("stake(...)", shouldBehaveLike.stake); - describe("transfer(...)", shouldBehaveLike.transfer); - describe("redeem(...)", shouldBehaveLike.redeem); - describe("lock(...)", shouldBehaveLike.lock); - describe("unlock(...)", shouldBehaveLike.unlock); - describe("balanceOf(...)", shouldBehaveLike.balanceOf); - describe("totalSupplyOf(...)", shouldBehaveLike.totalSupplyOf); -}; diff --git a/packages/hardhat/test/unit/index.js b/packages/hardhat/test/unit/index.js deleted file mode 100644 index af3ed44881..0000000000 --- a/packages/hardhat/test/unit/index.js +++ /dev/null @@ -1,38 +0,0 @@ -const shouldBehaveLike = require("./behaviors"); - -let snapshotId; -module.exports = function () { - beforeEach(async function () { - snapshotId = await this.snapshotFn(); - // Mark the start time of each test. - await this.setTimeMarkFn(); - }); - // Test each contract. - describe("OperatorStore", shouldBehaveLike.operatorStore); - describe("Prices", shouldBehaveLike.prices); - describe("Projects", shouldBehaveLike.projects); - describe("TerminalDirectory", shouldBehaveLike.terminalDirectory); - describe("Governance", shouldBehaveLike.governance); - describe("JuiceboxProject", shouldBehaveLike.JuiceboxProject); - // Depends on TerminalDirectory. - describe("FundingCycles", shouldBehaveLike.fundingCycles); - // Depends on TerminalDirectory. - describe("DirectPaymentAddress", shouldBehaveLike.directPaymentAddress); - // Depends on OperatorStore and Projects. - describe("ModStore", shouldBehaveLike.modStore); - // Depends on OperatorStore and Projects. - describe("TicketBooth", shouldBehaveLike.ticketBooth); - // TODO: dependency - describe("ProxyPaymentAddress", shouldBehaveLike.proxyPaymentAddress); - describe( - "ProxyPaymentAddressManager", - shouldBehaveLike.proxyPaymentAddressManager - ); - // Depends on everything. - describe("TerminalV1", shouldBehaveLike.terminalV1); - - // After each test, restore the contract state. - afterEach(async function () { - await this.restoreFn(snapshotId); - }); -}; diff --git a/packages/app/public/assets/arrow.png b/public/assets/arrow.png similarity index 100% rename from packages/app/public/assets/arrow.png rename to public/assets/arrow.png diff --git a/packages/app/public/assets/banana-cover.png b/public/assets/banana-cover.png similarity index 100% rename from packages/app/public/assets/banana-cover.png rename to public/assets/banana-cover.png diff --git a/packages/app/public/assets/banana-od.png b/public/assets/banana-od.png similarity index 100% rename from packages/app/public/assets/banana-od.png rename to public/assets/banana-od.png diff --git a/packages/app/public/assets/banana-ol.png b/public/assets/banana-ol.png similarity index 100% rename from packages/app/public/assets/banana-ol.png rename to public/assets/banana-ol.png diff --git a/packages/app/public/assets/banana_dwgj.png b/public/assets/banana_dwgj.png similarity index 100% rename from packages/app/public/assets/banana_dwgj.png rename to public/assets/banana_dwgj.png diff --git a/packages/app/public/assets/blueberry-ol.png b/public/assets/blueberry-ol.png similarity index 100% rename from packages/app/public/assets/blueberry-ol.png rename to public/assets/blueberry-ol.png diff --git a/packages/app/public/assets/bolt.png b/public/assets/bolt.png similarity index 100% rename from packages/app/public/assets/bolt.png rename to public/assets/bolt.png diff --git a/packages/app/public/assets/cooler_if_you_did.png b/public/assets/cooler_if_you_did.png similarity index 100% rename from packages/app/public/assets/cooler_if_you_did.png rename to public/assets/cooler_if_you_did.png diff --git a/packages/app/public/assets/fountain_of_juice.png b/public/assets/fountain_of_juice.png similarity index 100% rename from packages/app/public/assets/fountain_of_juice.png rename to public/assets/fountain_of_juice.png diff --git a/packages/app/public/assets/glass_overflow.png b/public/assets/glass_overflow.png similarity index 100% rename from packages/app/public/assets/glass_overflow.png rename to public/assets/glass_overflow.png diff --git a/packages/app/public/assets/juice_logo-od.png b/public/assets/juice_logo-od.png similarity index 100% rename from packages/app/public/assets/juice_logo-od.png rename to public/assets/juice_logo-od.png diff --git a/packages/app/public/assets/juice_logo-ol.png b/public/assets/juice_logo-ol.png similarity index 100% rename from packages/app/public/assets/juice_logo-ol.png rename to public/assets/juice_logo-ol.png diff --git a/packages/app/public/assets/orange_lady-od.png b/public/assets/orange_lady-od.png similarity index 100% rename from packages/app/public/assets/orange_lady-od.png rename to public/assets/orange_lady-od.png diff --git a/packages/app/public/assets/orange_lady-ol.png b/public/assets/orange_lady-ol.png similarity index 100% rename from packages/app/public/assets/orange_lady-ol.png rename to public/assets/orange_lady-ol.png diff --git a/packages/app/public/assets/pina.png b/public/assets/pina.png similarity index 100% rename from packages/app/public/assets/pina.png rename to public/assets/pina.png diff --git a/packages/app/public/favicon.ico b/public/favicon.ico similarity index 100% rename from packages/app/public/favicon.ico rename to public/favicon.ico diff --git a/packages/app/public/index.html b/public/index.html similarity index 100% rename from packages/app/public/index.html rename to public/index.html diff --git a/packages/app/public/info/1.txt b/public/info/1.txt similarity index 100% rename from packages/app/public/info/1.txt rename to public/info/1.txt diff --git a/packages/app/public/manifest.json b/public/manifest.json similarity index 100% rename from packages/app/public/manifest.json rename to public/manifest.json diff --git a/packages/app/public/robots.txt b/public/robots.txt similarity index 100% rename from packages/app/public/robots.txt rename to public/robots.txt diff --git a/packages/app/src/Network.tsx b/src/Network.tsx similarity index 100% rename from packages/app/src/Network.tsx rename to src/Network.tsx diff --git a/packages/app/src/Theme.tsx b/src/Theme.tsx similarity index 100% rename from packages/app/src/Theme.tsx rename to src/Theme.tsx diff --git a/packages/app/src/User.tsx b/src/User.tsx similarity index 100% rename from packages/app/src/User.tsx rename to src/User.tsx diff --git a/packages/app/src/components/App.test.tsx b/src/components/App.test.tsx similarity index 100% rename from packages/app/src/components/App.test.tsx rename to src/components/App.test.tsx diff --git a/packages/app/src/components/App.tsx b/src/components/App.tsx similarity index 100% rename from packages/app/src/components/App.tsx rename to src/components/App.tsx diff --git a/packages/app/src/components/CatchallRedirect.tsx b/src/components/CatchallRedirect.tsx similarity index 100% rename from packages/app/src/components/CatchallRedirect.tsx rename to src/components/CatchallRedirect.tsx diff --git a/packages/app/src/components/Create/BudgetForm.tsx b/src/components/Create/BudgetForm.tsx similarity index 100% rename from packages/app/src/components/Create/BudgetForm.tsx rename to src/components/Create/BudgetForm.tsx diff --git a/packages/app/src/components/Create/ConfirmDeployProject.tsx b/src/components/Create/ConfirmDeployProject.tsx similarity index 100% rename from packages/app/src/components/Create/ConfirmDeployProject.tsx rename to src/components/Create/ConfirmDeployProject.tsx diff --git a/packages/app/src/components/Create/IncentivesForm.tsx b/src/components/Create/IncentivesForm.tsx similarity index 100% rename from packages/app/src/components/Create/IncentivesForm.tsx rename to src/components/Create/IncentivesForm.tsx diff --git a/packages/app/src/components/Create/PayModsForm.tsx b/src/components/Create/PayModsForm.tsx similarity index 100% rename from packages/app/src/components/Create/PayModsForm.tsx rename to src/components/Create/PayModsForm.tsx diff --git a/packages/app/src/components/Create/ProjectForm.tsx b/src/components/Create/ProjectForm.tsx similarity index 100% rename from packages/app/src/components/Create/ProjectForm.tsx rename to src/components/Create/ProjectForm.tsx diff --git a/packages/app/src/components/Create/RulesForm.tsx b/src/components/Create/RulesForm.tsx similarity index 100% rename from packages/app/src/components/Create/RulesForm.tsx rename to src/components/Create/RulesForm.tsx diff --git a/packages/app/src/components/Create/TicketingForm.tsx b/src/components/Create/TicketingForm.tsx similarity index 100% rename from packages/app/src/components/Create/TicketingForm.tsx rename to src/components/Create/TicketingForm.tsx diff --git a/packages/app/src/components/Create/index.tsx b/src/components/Create/index.tsx similarity index 100% rename from packages/app/src/components/Create/index.tsx rename to src/components/Create/index.tsx diff --git a/packages/app/src/components/Dashboard/BalanceTimeline.tsx b/src/components/Dashboard/BalanceTimeline.tsx similarity index 100% rename from packages/app/src/components/Dashboard/BalanceTimeline.tsx rename to src/components/Dashboard/BalanceTimeline.tsx diff --git a/packages/app/src/components/Dashboard/FundingCycles.tsx b/src/components/Dashboard/FundingCycles.tsx similarity index 100% rename from packages/app/src/components/Dashboard/FundingCycles.tsx rename to src/components/Dashboard/FundingCycles.tsx diff --git a/packages/app/src/components/Dashboard/FundingHistory.tsx b/src/components/Dashboard/FundingHistory.tsx similarity index 100% rename from packages/app/src/components/Dashboard/FundingHistory.tsx rename to src/components/Dashboard/FundingHistory.tsx diff --git a/packages/app/src/components/Dashboard/IssueTickets.tsx b/src/components/Dashboard/IssueTickets.tsx similarity index 100% rename from packages/app/src/components/Dashboard/IssueTickets.tsx rename to src/components/Dashboard/IssueTickets.tsx diff --git a/packages/app/src/components/Dashboard/Paid.tsx b/src/components/Dashboard/Paid.tsx similarity index 100% rename from packages/app/src/components/Dashboard/Paid.tsx rename to src/components/Dashboard/Paid.tsx diff --git a/packages/app/src/components/Dashboard/Pay.tsx b/src/components/Dashboard/Pay.tsx similarity index 100% rename from packages/app/src/components/Dashboard/Pay.tsx rename to src/components/Dashboard/Pay.tsx diff --git a/packages/app/src/components/Dashboard/PrintPremined.tsx b/src/components/Dashboard/PrintPremined.tsx similarity index 100% rename from packages/app/src/components/Dashboard/PrintPremined.tsx rename to src/components/Dashboard/PrintPremined.tsx diff --git a/packages/app/src/components/Dashboard/Project.tsx b/src/components/Dashboard/Project.tsx similarity index 100% rename from packages/app/src/components/Dashboard/Project.tsx rename to src/components/Dashboard/Project.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/PayerReports.tsx b/src/components/Dashboard/ProjectActivity/PayerReports.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/PayerReports.tsx rename to src/components/Dashboard/ProjectActivity/PayerReports.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/PaymentActivity.tsx b/src/components/Dashboard/ProjectActivity/PaymentActivity.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/PaymentActivity.tsx rename to src/components/Dashboard/ProjectActivity/PaymentActivity.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/RedeemActivity.tsx b/src/components/Dashboard/ProjectActivity/RedeemActivity.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/RedeemActivity.tsx rename to src/components/Dashboard/ProjectActivity/RedeemActivity.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/ReservesActivity.tsx b/src/components/Dashboard/ProjectActivity/ReservesActivity.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/ReservesActivity.tsx rename to src/components/Dashboard/ProjectActivity/ReservesActivity.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/ReservesEventElem.tsx b/src/components/Dashboard/ProjectActivity/ReservesEventElem.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/ReservesEventElem.tsx rename to src/components/Dashboard/ProjectActivity/ReservesEventElem.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/RichNote.tsx b/src/components/Dashboard/ProjectActivity/RichNote.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/RichNote.tsx rename to src/components/Dashboard/ProjectActivity/RichNote.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/TapActivity.tsx b/src/components/Dashboard/ProjectActivity/TapActivity.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/TapActivity.tsx rename to src/components/Dashboard/ProjectActivity/TapActivity.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/TapEventElem.tsx b/src/components/Dashboard/ProjectActivity/TapEventElem.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/TapEventElem.tsx rename to src/components/Dashboard/ProjectActivity/TapEventElem.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/index.tsx b/src/components/Dashboard/ProjectActivity/index.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/index.tsx rename to src/components/Dashboard/ProjectActivity/index.tsx diff --git a/packages/app/src/components/Dashboard/ProjectActivity/styles.ts b/src/components/Dashboard/ProjectActivity/styles.ts similarity index 100% rename from packages/app/src/components/Dashboard/ProjectActivity/styles.ts rename to src/components/Dashboard/ProjectActivity/styles.ts diff --git a/packages/app/src/components/Dashboard/ProjectHeader.tsx b/src/components/Dashboard/ProjectHeader.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ProjectHeader.tsx rename to src/components/Dashboard/ProjectHeader.tsx diff --git a/packages/app/src/components/Dashboard/ReservedTokens.tsx b/src/components/Dashboard/ReservedTokens.tsx similarity index 100% rename from packages/app/src/components/Dashboard/ReservedTokens.tsx rename to src/components/Dashboard/ReservedTokens.tsx diff --git a/packages/app/src/components/Dashboard/Rewards.tsx b/src/components/Dashboard/Rewards.tsx similarity index 100% rename from packages/app/src/components/Dashboard/Rewards.tsx rename to src/components/Dashboard/Rewards.tsx diff --git a/packages/app/src/components/Dashboard/SectionHeader.tsx b/src/components/Dashboard/SectionHeader.tsx similarity index 100% rename from packages/app/src/components/Dashboard/SectionHeader.tsx rename to src/components/Dashboard/SectionHeader.tsx diff --git a/packages/app/src/components/Dashboard/Spending.tsx b/src/components/Dashboard/Spending.tsx similarity index 100% rename from packages/app/src/components/Dashboard/Spending.tsx rename to src/components/Dashboard/Spending.tsx diff --git a/packages/app/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx similarity index 100% rename from packages/app/src/components/Dashboard/index.tsx rename to src/components/Dashboard/index.tsx diff --git a/packages/app/src/components/Dashboard/styles.ts b/src/components/Dashboard/styles.ts similarity index 100% rename from packages/app/src/components/Dashboard/styles.ts rename to src/components/Dashboard/styles.ts diff --git a/packages/app/src/components/FundingCycle/CurrentFundingCycle.tsx b/src/components/FundingCycle/CurrentFundingCycle.tsx similarity index 100% rename from packages/app/src/components/FundingCycle/CurrentFundingCycle.tsx rename to src/components/FundingCycle/CurrentFundingCycle.tsx diff --git a/packages/app/src/components/FundingCycle/FundingCycleDetails.tsx b/src/components/FundingCycle/FundingCycleDetails.tsx similarity index 100% rename from packages/app/src/components/FundingCycle/FundingCycleDetails.tsx rename to src/components/FundingCycle/FundingCycleDetails.tsx diff --git a/packages/app/src/components/FundingCycle/FundingCyclePreview.tsx b/src/components/FundingCycle/FundingCyclePreview.tsx similarity index 100% rename from packages/app/src/components/FundingCycle/FundingCyclePreview.tsx rename to src/components/FundingCycle/FundingCyclePreview.tsx diff --git a/packages/app/src/components/FundingCycle/QueuedFundingCycle.tsx b/src/components/FundingCycle/QueuedFundingCycle.tsx similarity index 100% rename from packages/app/src/components/FundingCycle/QueuedFundingCycle.tsx rename to src/components/FundingCycle/QueuedFundingCycle.tsx diff --git a/packages/app/src/components/Gimme.tsx b/src/components/Gimme.tsx similarity index 100% rename from packages/app/src/components/Gimme.tsx rename to src/components/Gimme.tsx diff --git a/packages/app/src/components/Landing/DefineProject.tsx b/src/components/Landing/DefineProject.tsx similarity index 100% rename from packages/app/src/components/Landing/DefineProject.tsx rename to src/components/Landing/DefineProject.tsx diff --git a/packages/app/src/components/Landing/Faq.tsx b/src/components/Landing/Faq.tsx similarity index 100% rename from packages/app/src/components/Landing/Faq.tsx rename to src/components/Landing/Faq.tsx diff --git a/packages/app/src/components/Landing/Footer.tsx b/src/components/Landing/Footer.tsx similarity index 100% rename from packages/app/src/components/Landing/Footer.tsx rename to src/components/Landing/Footer.tsx diff --git a/packages/app/src/components/Landing/index.tsx b/src/components/Landing/index.tsx similarity index 100% rename from packages/app/src/components/Landing/index.tsx rename to src/components/Landing/index.tsx diff --git a/packages/app/src/components/Navbar/Account.tsx b/src/components/Navbar/Account.tsx similarity index 100% rename from packages/app/src/components/Navbar/Account.tsx rename to src/components/Navbar/Account.tsx diff --git a/packages/app/src/components/Navbar/Balance.tsx b/src/components/Navbar/Balance.tsx similarity index 100% rename from packages/app/src/components/Navbar/Balance.tsx rename to src/components/Navbar/Balance.tsx diff --git a/packages/app/src/components/Navbar/EthPrice.tsx b/src/components/Navbar/EthPrice.tsx similarity index 100% rename from packages/app/src/components/Navbar/EthPrice.tsx rename to src/components/Navbar/EthPrice.tsx diff --git a/packages/app/src/components/Navbar/ThemePicker.tsx b/src/components/Navbar/ThemePicker.tsx similarity index 100% rename from packages/app/src/components/Navbar/ThemePicker.tsx rename to src/components/Navbar/ThemePicker.tsx diff --git a/packages/app/src/components/Navbar/Wallet.tsx b/src/components/Navbar/Wallet.tsx similarity index 100% rename from packages/app/src/components/Navbar/Wallet.tsx rename to src/components/Navbar/Wallet.tsx diff --git a/packages/app/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx similarity index 100% rename from packages/app/src/components/Navbar/index.tsx rename to src/components/Navbar/index.tsx diff --git a/packages/app/src/components/Projects/index.tsx b/src/components/Projects/index.tsx similarity index 100% rename from packages/app/src/components/Projects/index.tsx rename to src/components/Projects/index.tsx diff --git a/packages/app/src/components/Router.tsx b/src/components/Router.tsx similarity index 100% rename from packages/app/src/components/Router.tsx rename to src/components/Router.tsx diff --git a/packages/app/src/components/icons/Moon.tsx b/src/components/icons/Moon.tsx similarity index 100% rename from packages/app/src/components/icons/Moon.tsx rename to src/components/icons/Moon.tsx diff --git a/packages/app/src/components/icons/Sun.tsx b/src/components/icons/Sun.tsx similarity index 100% rename from packages/app/src/components/icons/Sun.tsx rename to src/components/icons/Sun.tsx diff --git a/packages/app/src/components/modals/BalancesModal.tsx b/src/components/modals/BalancesModal.tsx similarity index 100% rename from packages/app/src/components/modals/BalancesModal.tsx rename to src/components/modals/BalancesModal.tsx diff --git a/packages/app/src/components/modals/ConfirmPayOwnerModal.tsx b/src/components/modals/ConfirmPayOwnerModal.tsx similarity index 100% rename from packages/app/src/components/modals/ConfirmPayOwnerModal.tsx rename to src/components/modals/ConfirmPayOwnerModal.tsx diff --git a/packages/app/src/components/modals/ConfirmStakeTokensModal.tsx b/src/components/modals/ConfirmStakeTokensModal.tsx similarity index 100% rename from packages/app/src/components/modals/ConfirmStakeTokensModal.tsx rename to src/components/modals/ConfirmStakeTokensModal.tsx diff --git a/packages/app/src/components/modals/ConfirmUnstakeTokensModal.tsx b/src/components/modals/ConfirmUnstakeTokensModal.tsx similarity index 100% rename from packages/app/src/components/modals/ConfirmUnstakeTokensModal.tsx rename to src/components/modals/ConfirmUnstakeTokensModal.tsx diff --git a/packages/app/src/components/modals/DistributeTokensModal.tsx b/src/components/modals/DistributeTokensModal.tsx similarity index 100% rename from packages/app/src/components/modals/DistributeTokensModal.tsx rename to src/components/modals/DistributeTokensModal.tsx diff --git a/packages/app/src/components/modals/EditProjectModal.tsx b/src/components/modals/EditProjectModal.tsx similarity index 100% rename from packages/app/src/components/modals/EditProjectModal.tsx rename to src/components/modals/EditProjectModal.tsx diff --git a/packages/app/src/components/modals/ProjectToolDrawerModal.tsx b/src/components/modals/ProjectToolDrawerModal.tsx similarity index 100% rename from packages/app/src/components/modals/ProjectToolDrawerModal.tsx rename to src/components/modals/ProjectToolDrawerModal.tsx diff --git a/packages/app/src/components/modals/ReconfigureFCModal.tsx b/src/components/modals/ReconfigureFCModal.tsx similarity index 100% rename from packages/app/src/components/modals/ReconfigureFCModal.tsx rename to src/components/modals/ReconfigureFCModal.tsx diff --git a/packages/app/src/components/modals/WithdrawModal.tsx b/src/components/modals/WithdrawModal.tsx similarity index 100% rename from packages/app/src/components/modals/WithdrawModal.tsx rename to src/components/modals/WithdrawModal.tsx diff --git a/packages/app/src/components/shared/CardSection.tsx b/src/components/shared/CardSection.tsx similarity index 100% rename from packages/app/src/components/shared/CardSection.tsx rename to src/components/shared/CardSection.tsx diff --git a/packages/app/src/components/shared/CurrencySymbol.tsx b/src/components/shared/CurrencySymbol.tsx similarity index 100% rename from packages/app/src/components/shared/CurrencySymbol.tsx rename to src/components/shared/CurrencySymbol.tsx diff --git a/packages/app/src/components/shared/ERC20TokenBalance.tsx b/src/components/shared/ERC20TokenBalance.tsx similarity index 100% rename from packages/app/src/components/shared/ERC20TokenBalance.tsx rename to src/components/shared/ERC20TokenBalance.tsx diff --git a/packages/app/src/components/shared/FCNumber.tsx b/src/components/shared/FCNumber.tsx similarity index 100% rename from packages/app/src/components/shared/FCNumber.tsx rename to src/components/shared/FCNumber.tsx diff --git a/packages/app/src/components/shared/FormattedAddress.tsx b/src/components/shared/FormattedAddress.tsx similarity index 100% rename from packages/app/src/components/shared/FormattedAddress.tsx rename to src/components/shared/FormattedAddress.tsx diff --git a/packages/app/src/components/shared/InputAccessoryButton.tsx b/src/components/shared/InputAccessoryButton.tsx similarity index 100% rename from packages/app/src/components/shared/InputAccessoryButton.tsx rename to src/components/shared/InputAccessoryButton.tsx diff --git a/packages/app/src/components/shared/Loading.tsx b/src/components/shared/Loading.tsx similarity index 100% rename from packages/app/src/components/shared/Loading.tsx rename to src/components/shared/Loading.tsx diff --git a/packages/app/src/components/shared/Mod.tsx b/src/components/shared/Mod.tsx similarity index 100% rename from packages/app/src/components/shared/Mod.tsx rename to src/components/shared/Mod.tsx diff --git a/packages/app/src/components/shared/PayoutModsList.tsx b/src/components/shared/PayoutModsList.tsx similarity index 100% rename from packages/app/src/components/shared/PayoutModsList.tsx rename to src/components/shared/PayoutModsList.tsx diff --git a/packages/app/src/components/shared/ProjectCard.tsx b/src/components/shared/ProjectCard.tsx similarity index 100% rename from packages/app/src/components/shared/ProjectCard.tsx rename to src/components/shared/ProjectCard.tsx diff --git a/packages/app/src/components/shared/ProjectHandle.tsx b/src/components/shared/ProjectHandle.tsx similarity index 100% rename from packages/app/src/components/shared/ProjectHandle.tsx rename to src/components/shared/ProjectHandle.tsx diff --git a/packages/app/src/components/shared/ProjectLogo.tsx b/src/components/shared/ProjectLogo.tsx similarity index 100% rename from packages/app/src/components/shared/ProjectLogo.tsx rename to src/components/shared/ProjectLogo.tsx diff --git a/packages/app/src/components/shared/ProjectTokenBalance.tsx b/src/components/shared/ProjectTokenBalance.tsx similarity index 100% rename from packages/app/src/components/shared/ProjectTokenBalance.tsx rename to src/components/shared/ProjectTokenBalance.tsx diff --git a/packages/app/src/components/shared/ProjectsGrid.tsx b/src/components/shared/ProjectsGrid.tsx similarity index 100% rename from packages/app/src/components/shared/ProjectsGrid.tsx rename to src/components/shared/ProjectsGrid.tsx diff --git a/packages/app/src/components/shared/RichImgPreview.tsx b/src/components/shared/RichImgPreview.tsx similarity index 100% rename from packages/app/src/components/shared/RichImgPreview.tsx rename to src/components/shared/RichImgPreview.tsx diff --git a/packages/app/src/components/shared/TicketModsList.tsx b/src/components/shared/TicketModsList.tsx similarity index 100% rename from packages/app/src/components/shared/TicketModsList.tsx rename to src/components/shared/TicketModsList.tsx diff --git a/packages/app/src/components/shared/TooltipIcon.tsx b/src/components/shared/TooltipIcon.tsx similarity index 100% rename from packages/app/src/components/shared/TooltipIcon.tsx rename to src/components/shared/TooltipIcon.tsx diff --git a/packages/app/src/components/shared/TooltipLabel.tsx b/src/components/shared/TooltipLabel.tsx similarity index 100% rename from packages/app/src/components/shared/TooltipLabel.tsx rename to src/components/shared/TooltipLabel.tsx diff --git a/packages/app/src/components/shared/WtfCard.tsx b/src/components/shared/WtfCard.tsx similarity index 100% rename from packages/app/src/components/shared/WtfCard.tsx rename to src/components/shared/WtfCard.tsx diff --git a/packages/app/src/components/shared/formItems/EthAddress.tsx b/src/components/shared/formItems/EthAddress.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/EthAddress.tsx rename to src/components/shared/formItems/EthAddress.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectBondingCurveRate.tsx b/src/components/shared/formItems/ProjectBondingCurveRate.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectBondingCurveRate.tsx rename to src/components/shared/formItems/ProjectBondingCurveRate.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectDescription.tsx b/src/components/shared/formItems/ProjectDescription.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectDescription.tsx rename to src/components/shared/formItems/ProjectDescription.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectDiscountRate.tsx b/src/components/shared/formItems/ProjectDiscountRate.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectDiscountRate.tsx rename to src/components/shared/formItems/ProjectDiscountRate.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectDuration.tsx b/src/components/shared/formItems/ProjectDuration.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectDuration.tsx rename to src/components/shared/formItems/ProjectDuration.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectHandle.tsx b/src/components/shared/formItems/ProjectHandle.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectHandle.tsx rename to src/components/shared/formItems/ProjectHandle.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectLink.tsx b/src/components/shared/formItems/ProjectLink.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectLink.tsx rename to src/components/shared/formItems/ProjectLink.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectLogoUrl.tsx b/src/components/shared/formItems/ProjectLogoUrl.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectLogoUrl.tsx rename to src/components/shared/formItems/ProjectLogoUrl.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectName.tsx b/src/components/shared/formItems/ProjectName.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectName.tsx rename to src/components/shared/formItems/ProjectName.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectPayoutMods.tsx b/src/components/shared/formItems/ProjectPayoutMods.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectPayoutMods.tsx rename to src/components/shared/formItems/ProjectPayoutMods.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectReserved.tsx b/src/components/shared/formItems/ProjectReserved.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectReserved.tsx rename to src/components/shared/formItems/ProjectReserved.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectTarget.tsx b/src/components/shared/formItems/ProjectTarget.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectTarget.tsx rename to src/components/shared/formItems/ProjectTarget.tsx diff --git a/packages/app/src/components/shared/formItems/ProjectTicketMods.tsx b/src/components/shared/formItems/ProjectTicketMods.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/ProjectTicketMods.tsx rename to src/components/shared/formItems/ProjectTicketMods.tsx diff --git a/packages/app/src/components/shared/formItems/TokenRefs.tsx b/src/components/shared/formItems/TokenRefs.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/TokenRefs.tsx rename to src/components/shared/formItems/TokenRefs.tsx diff --git a/packages/app/src/components/shared/formItems/formItemExt.tsx b/src/components/shared/formItems/formItemExt.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/formItemExt.tsx rename to src/components/shared/formItems/formItemExt.tsx diff --git a/packages/app/src/components/shared/formItems/index.tsx b/src/components/shared/formItems/index.tsx similarity index 100% rename from packages/app/src/components/shared/formItems/index.tsx rename to src/components/shared/formItems/index.tsx diff --git a/packages/app/src/components/shared/inputs/BudgetTargetInput.tsx b/src/components/shared/inputs/BudgetTargetInput.tsx similarity index 100% rename from packages/app/src/components/shared/inputs/BudgetTargetInput.tsx rename to src/components/shared/inputs/BudgetTargetInput.tsx diff --git a/packages/app/src/components/shared/inputs/FormattedNumberInput.tsx b/src/components/shared/inputs/FormattedNumberInput.tsx similarity index 100% rename from packages/app/src/components/shared/inputs/FormattedNumberInput.tsx rename to src/components/shared/inputs/FormattedNumberInput.tsx diff --git a/packages/app/src/components/shared/inputs/ImageUploader.tsx b/src/components/shared/inputs/ImageUploader.tsx similarity index 100% rename from packages/app/src/components/shared/inputs/ImageUploader.tsx rename to src/components/shared/inputs/ImageUploader.tsx diff --git a/packages/app/src/components/shared/inputs/NumberSlider.tsx b/src/components/shared/inputs/NumberSlider.tsx similarity index 100% rename from packages/app/src/components/shared/inputs/NumberSlider.tsx rename to src/components/shared/inputs/NumberSlider.tsx diff --git a/packages/app/src/constants/ballot-strategies.ts b/src/constants/ballot-strategies.ts similarity index 100% rename from packages/app/src/constants/ballot-strategies.ts rename to src/constants/ballot-strategies.ts diff --git a/packages/app/src/constants/networks.ts b/src/constants/networks.ts similarity index 100% rename from packages/app/src/constants/networks.ts rename to src/constants/networks.ts diff --git a/packages/app/src/constants/project-types.ts b/src/constants/project-types.ts similarity index 100% rename from packages/app/src/constants/project-types.ts rename to src/constants/project-types.ts diff --git a/packages/app/src/constants/readProvider.ts b/src/constants/readProvider.ts similarity index 100% rename from packages/app/src/constants/readProvider.ts rename to src/constants/readProvider.ts diff --git a/packages/app/src/constants/styles/colors.ts b/src/constants/styles/colors.ts similarity index 100% rename from packages/app/src/constants/styles/colors.ts rename to src/constants/styles/colors.ts diff --git a/packages/app/src/constants/styles/layouts.ts b/src/constants/styles/layouts.ts similarity index 100% rename from packages/app/src/constants/styles/layouts.ts rename to src/constants/styles/layouts.ts diff --git a/packages/app/src/constants/styles/padding.ts b/src/constants/styles/padding.ts similarity index 100% rename from packages/app/src/constants/styles/padding.ts rename to src/constants/styles/padding.ts diff --git a/packages/app/src/constants/styles/shadowCard.ts b/src/constants/styles/shadowCard.ts similarity index 100% rename from packages/app/src/constants/styles/shadowCard.ts rename to src/constants/styles/shadowCard.ts diff --git a/packages/app/src/constants/subgraphs.ts b/src/constants/subgraphs.ts similarity index 100% rename from packages/app/src/constants/subgraphs.ts rename to src/constants/subgraphs.ts diff --git a/packages/app/src/constants/theme/colors/background.ts b/src/constants/theme/colors/background.ts similarity index 100% rename from packages/app/src/constants/theme/colors/background.ts rename to src/constants/theme/colors/background.ts diff --git a/packages/app/src/constants/theme/colors/icon.ts b/src/constants/theme/colors/icon.ts similarity index 100% rename from packages/app/src/constants/theme/colors/icon.ts rename to src/constants/theme/colors/icon.ts diff --git a/packages/app/src/constants/theme/colors/index.ts b/src/constants/theme/colors/index.ts similarity index 100% rename from packages/app/src/constants/theme/colors/index.ts rename to src/constants/theme/colors/index.ts diff --git a/packages/app/src/constants/theme/colors/stroke.ts b/src/constants/theme/colors/stroke.ts similarity index 100% rename from packages/app/src/constants/theme/colors/stroke.ts rename to src/constants/theme/colors/stroke.ts diff --git a/packages/app/src/constants/theme/colors/text.ts b/src/constants/theme/colors/text.ts similarity index 100% rename from packages/app/src/constants/theme/colors/text.ts rename to src/constants/theme/colors/text.ts diff --git a/packages/app/src/constants/theme/index.ts b/src/constants/theme/index.ts similarity index 100% rename from packages/app/src/constants/theme/index.ts rename to src/constants/theme/index.ts diff --git a/packages/app/src/constants/theme/radius/index.ts b/src/constants/theme/radius/index.ts similarity index 100% rename from packages/app/src/constants/theme/radius/index.ts rename to src/constants/theme/radius/index.ts diff --git a/packages/app/src/constants/theme/theme-option.ts b/src/constants/theme/theme-option.ts similarity index 100% rename from packages/app/src/constants/theme/theme-option.ts rename to src/constants/theme/theme-option.ts diff --git a/packages/app/src/constants/tokens/dai.ts b/src/constants/tokens/dai.ts similarity index 100% rename from packages/app/src/constants/tokens/dai.ts rename to src/constants/tokens/dai.ts diff --git a/packages/app/src/contexts/networkContext.ts b/src/contexts/networkContext.ts similarity index 100% rename from packages/app/src/contexts/networkContext.ts rename to src/contexts/networkContext.ts diff --git a/packages/app/src/contexts/projectContext.ts b/src/contexts/projectContext.ts similarity index 100% rename from packages/app/src/contexts/projectContext.ts rename to src/contexts/projectContext.ts diff --git a/packages/app/src/contexts/themeContext.ts b/src/contexts/themeContext.ts similarity index 100% rename from packages/app/src/contexts/themeContext.ts rename to src/contexts/themeContext.ts diff --git a/packages/app/src/contexts/userContext.ts b/src/contexts/userContext.ts similarity index 100% rename from packages/app/src/contexts/userContext.ts rename to src/contexts/userContext.ts diff --git a/packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.abi.js b/src/contracts/kovan/Active14DaysFundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.abi.js rename to src/contracts/kovan/Active14DaysFundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.address.js b/src/contracts/kovan/Active14DaysFundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.address.js rename to src/contracts/kovan/Active14DaysFundingCycleBallot.address.js diff --git a/packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.bytecode.js b/src/contracts/kovan/Active14DaysFundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Active14DaysFundingCycleBallot.bytecode.js rename to src/contracts/kovan/Active14DaysFundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.abi.js b/src/contracts/kovan/Active7DaysFundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.abi.js rename to src/contracts/kovan/Active7DaysFundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.address.js b/src/contracts/kovan/Active7DaysFundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.address.js rename to src/contracts/kovan/Active7DaysFundingCycleBallot.address.js diff --git a/packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.bytecode.js b/src/contracts/kovan/Active7DaysFundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Active7DaysFundingCycleBallot.bytecode.js rename to src/contracts/kovan/Active7DaysFundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/kovan/Admin.abi.js b/src/contracts/kovan/Admin.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Admin.abi.js rename to src/contracts/kovan/Admin.abi.js diff --git a/packages/app/src/contracts/kovan/Admin.address.js b/src/contracts/kovan/Admin.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Admin.address.js rename to src/contracts/kovan/Admin.address.js diff --git a/packages/app/src/contracts/kovan/Admin.bytecode.js b/src/contracts/kovan/Admin.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Admin.bytecode.js rename to src/contracts/kovan/Admin.bytecode.js diff --git a/packages/app/src/contracts/kovan/BudgetBallot.abi.js b/src/contracts/kovan/BudgetBallot.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetBallot.abi.js rename to src/contracts/kovan/BudgetBallot.abi.js diff --git a/packages/app/src/contracts/kovan/BudgetBallot.address.js b/src/contracts/kovan/BudgetBallot.address.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetBallot.address.js rename to src/contracts/kovan/BudgetBallot.address.js diff --git a/packages/app/src/contracts/kovan/BudgetBallot.bytecode.js b/src/contracts/kovan/BudgetBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetBallot.bytecode.js rename to src/contracts/kovan/BudgetBallot.bytecode.js diff --git a/packages/app/src/contracts/kovan/BudgetStore.abi.js b/src/contracts/kovan/BudgetStore.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetStore.abi.js rename to src/contracts/kovan/BudgetStore.abi.js diff --git a/packages/app/src/contracts/kovan/BudgetStore.address.js b/src/contracts/kovan/BudgetStore.address.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetStore.address.js rename to src/contracts/kovan/BudgetStore.address.js diff --git a/packages/app/src/contracts/kovan/BudgetStore.bytecode.js b/src/contracts/kovan/BudgetStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/BudgetStore.bytecode.js rename to src/contracts/kovan/BudgetStore.bytecode.js diff --git a/packages/app/src/contracts/kovan/DirectPayments.abi.js b/src/contracts/kovan/DirectPayments.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/DirectPayments.abi.js rename to src/contracts/kovan/DirectPayments.abi.js diff --git a/packages/app/src/contracts/kovan/DirectPayments.address.js b/src/contracts/kovan/DirectPayments.address.js similarity index 100% rename from packages/app/src/contracts/kovan/DirectPayments.address.js rename to src/contracts/kovan/DirectPayments.address.js diff --git a/packages/app/src/contracts/kovan/DirectPayments.bytecode.js b/src/contracts/kovan/DirectPayments.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/DirectPayments.bytecode.js rename to src/contracts/kovan/DirectPayments.bytecode.js diff --git a/packages/app/src/contracts/kovan/FundingCycleBallot.abi.js b/src/contracts/kovan/FundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycleBallot.abi.js rename to src/contracts/kovan/FundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/kovan/FundingCycleBallot.address.js b/src/contracts/kovan/FundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycleBallot.address.js rename to src/contracts/kovan/FundingCycleBallot.address.js diff --git a/packages/app/src/contracts/kovan/FundingCycleBallot.bytecode.js b/src/contracts/kovan/FundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycleBallot.bytecode.js rename to src/contracts/kovan/FundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/kovan/FundingCycles.abi.js b/src/contracts/kovan/FundingCycles.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycles.abi.js rename to src/contracts/kovan/FundingCycles.abi.js diff --git a/packages/app/src/contracts/kovan/FundingCycles.address.js b/src/contracts/kovan/FundingCycles.address.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycles.address.js rename to src/contracts/kovan/FundingCycles.address.js diff --git a/packages/app/src/contracts/kovan/FundingCycles.bytecode.js b/src/contracts/kovan/FundingCycles.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/FundingCycles.bytecode.js rename to src/contracts/kovan/FundingCycles.bytecode.js diff --git a/packages/app/src/contracts/kovan/Governance.abi.js b/src/contracts/kovan/Governance.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Governance.abi.js rename to src/contracts/kovan/Governance.abi.js diff --git a/packages/app/src/contracts/kovan/Governance.address.js b/src/contracts/kovan/Governance.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Governance.address.js rename to src/contracts/kovan/Governance.address.js diff --git a/packages/app/src/contracts/kovan/Governance.bytecode.js b/src/contracts/kovan/Governance.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Governance.bytecode.js rename to src/contracts/kovan/Governance.bytecode.js diff --git a/packages/app/src/contracts/kovan/JuiceTerminalDirectory.abi.js b/src/contracts/kovan/JuiceTerminalDirectory.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/JuiceTerminalDirectory.abi.js rename to src/contracts/kovan/JuiceTerminalDirectory.abi.js diff --git a/packages/app/src/contracts/kovan/JuiceTerminalDirectory.address.js b/src/contracts/kovan/JuiceTerminalDirectory.address.js similarity index 100% rename from packages/app/src/contracts/kovan/JuiceTerminalDirectory.address.js rename to src/contracts/kovan/JuiceTerminalDirectory.address.js diff --git a/packages/app/src/contracts/kovan/JuiceTerminalDirectory.bytecode.js b/src/contracts/kovan/JuiceTerminalDirectory.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/JuiceTerminalDirectory.bytecode.js rename to src/contracts/kovan/JuiceTerminalDirectory.bytecode.js diff --git a/packages/app/src/contracts/kovan/Juicer.abi.js b/src/contracts/kovan/Juicer.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Juicer.abi.js rename to src/contracts/kovan/Juicer.abi.js diff --git a/packages/app/src/contracts/kovan/Juicer.address.js b/src/contracts/kovan/Juicer.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Juicer.address.js rename to src/contracts/kovan/Juicer.address.js diff --git a/packages/app/src/contracts/kovan/Juicer.bytecode.js b/src/contracts/kovan/Juicer.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Juicer.bytecode.js rename to src/contracts/kovan/Juicer.bytecode.js diff --git a/packages/app/src/contracts/kovan/ModStore.abi.js b/src/contracts/kovan/ModStore.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/ModStore.abi.js rename to src/contracts/kovan/ModStore.abi.js diff --git a/packages/app/src/contracts/kovan/ModStore.address.js b/src/contracts/kovan/ModStore.address.js similarity index 100% rename from packages/app/src/contracts/kovan/ModStore.address.js rename to src/contracts/kovan/ModStore.address.js diff --git a/packages/app/src/contracts/kovan/ModStore.bytecode.js b/src/contracts/kovan/ModStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/ModStore.bytecode.js rename to src/contracts/kovan/ModStore.bytecode.js diff --git a/packages/app/src/contracts/kovan/OperatorStore.abi.js b/src/contracts/kovan/OperatorStore.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/OperatorStore.abi.js rename to src/contracts/kovan/OperatorStore.abi.js diff --git a/packages/app/src/contracts/kovan/OperatorStore.address.js b/src/contracts/kovan/OperatorStore.address.js similarity index 100% rename from packages/app/src/contracts/kovan/OperatorStore.address.js rename to src/contracts/kovan/OperatorStore.address.js diff --git a/packages/app/src/contracts/kovan/OperatorStore.bytecode.js b/src/contracts/kovan/OperatorStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/OperatorStore.bytecode.js rename to src/contracts/kovan/OperatorStore.bytecode.js diff --git a/packages/app/src/contracts/kovan/Prices.abi.js b/src/contracts/kovan/Prices.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Prices.abi.js rename to src/contracts/kovan/Prices.abi.js diff --git a/packages/app/src/contracts/kovan/Prices.address.js b/src/contracts/kovan/Prices.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Prices.address.js rename to src/contracts/kovan/Prices.address.js diff --git a/packages/app/src/contracts/kovan/Prices.bytecode.js b/src/contracts/kovan/Prices.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Prices.bytecode.js rename to src/contracts/kovan/Prices.bytecode.js diff --git a/packages/app/src/contracts/kovan/Projects.abi.js b/src/contracts/kovan/Projects.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Projects.abi.js rename to src/contracts/kovan/Projects.abi.js diff --git a/packages/app/src/contracts/kovan/Projects.address.js b/src/contracts/kovan/Projects.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Projects.address.js rename to src/contracts/kovan/Projects.address.js diff --git a/packages/app/src/contracts/kovan/Projects.bytecode.js b/src/contracts/kovan/Projects.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Projects.bytecode.js rename to src/contracts/kovan/Projects.bytecode.js diff --git a/packages/app/src/contracts/kovan/TerminalDirectory.abi.js b/src/contracts/kovan/TerminalDirectory.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalDirectory.abi.js rename to src/contracts/kovan/TerminalDirectory.abi.js diff --git a/packages/app/src/contracts/kovan/TerminalDirectory.address.js b/src/contracts/kovan/TerminalDirectory.address.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalDirectory.address.js rename to src/contracts/kovan/TerminalDirectory.address.js diff --git a/packages/app/src/contracts/kovan/TerminalDirectory.bytecode.js b/src/contracts/kovan/TerminalDirectory.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalDirectory.bytecode.js rename to src/contracts/kovan/TerminalDirectory.bytecode.js diff --git a/packages/app/src/contracts/kovan/TerminalV1.abi.js b/src/contracts/kovan/TerminalV1.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalV1.abi.js rename to src/contracts/kovan/TerminalV1.abi.js diff --git a/packages/app/src/contracts/kovan/TerminalV1.address.js b/src/contracts/kovan/TerminalV1.address.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalV1.address.js rename to src/contracts/kovan/TerminalV1.address.js diff --git a/packages/app/src/contracts/kovan/TerminalV1.bytecode.js b/src/contracts/kovan/TerminalV1.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/TerminalV1.bytecode.js rename to src/contracts/kovan/TerminalV1.bytecode.js diff --git a/packages/app/src/contracts/kovan/TicketBooth.abi.js b/src/contracts/kovan/TicketBooth.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketBooth.abi.js rename to src/contracts/kovan/TicketBooth.abi.js diff --git a/packages/app/src/contracts/kovan/TicketBooth.address.js b/src/contracts/kovan/TicketBooth.address.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketBooth.address.js rename to src/contracts/kovan/TicketBooth.address.js diff --git a/packages/app/src/contracts/kovan/TicketBooth.bytecode.js b/src/contracts/kovan/TicketBooth.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketBooth.bytecode.js rename to src/contracts/kovan/TicketBooth.bytecode.js diff --git a/packages/app/src/contracts/kovan/TicketStore.abi.js b/src/contracts/kovan/TicketStore.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketStore.abi.js rename to src/contracts/kovan/TicketStore.abi.js diff --git a/packages/app/src/contracts/kovan/TicketStore.address.js b/src/contracts/kovan/TicketStore.address.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketStore.address.js rename to src/contracts/kovan/TicketStore.address.js diff --git a/packages/app/src/contracts/kovan/TicketStore.bytecode.js b/src/contracts/kovan/TicketStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/TicketStore.bytecode.js rename to src/contracts/kovan/TicketStore.bytecode.js diff --git a/packages/app/src/contracts/kovan/Tickets.abi.js b/src/contracts/kovan/Tickets.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Tickets.abi.js rename to src/contracts/kovan/Tickets.abi.js diff --git a/packages/app/src/contracts/kovan/Tickets.address.js b/src/contracts/kovan/Tickets.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Tickets.address.js rename to src/contracts/kovan/Tickets.address.js diff --git a/packages/app/src/contracts/kovan/Tickets.bytecode.js b/src/contracts/kovan/Tickets.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Tickets.bytecode.js rename to src/contracts/kovan/Tickets.bytecode.js diff --git a/packages/app/src/contracts/kovan/TimelockStaker.abi.js b/src/contracts/kovan/TimelockStaker.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/TimelockStaker.abi.js rename to src/contracts/kovan/TimelockStaker.abi.js diff --git a/packages/app/src/contracts/kovan/TimelockStaker.address.js b/src/contracts/kovan/TimelockStaker.address.js similarity index 100% rename from packages/app/src/contracts/kovan/TimelockStaker.address.js rename to src/contracts/kovan/TimelockStaker.address.js diff --git a/packages/app/src/contracts/kovan/TimelockStaker.bytecode.js b/src/contracts/kovan/TimelockStaker.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/TimelockStaker.bytecode.js rename to src/contracts/kovan/TimelockStaker.bytecode.js diff --git a/packages/app/src/contracts/kovan/Token.abi.js b/src/contracts/kovan/Token.abi.js similarity index 100% rename from packages/app/src/contracts/kovan/Token.abi.js rename to src/contracts/kovan/Token.abi.js diff --git a/packages/app/src/contracts/kovan/Token.address.js b/src/contracts/kovan/Token.address.js similarity index 100% rename from packages/app/src/contracts/kovan/Token.address.js rename to src/contracts/kovan/Token.address.js diff --git a/packages/app/src/contracts/kovan/Token.bytecode.js b/src/contracts/kovan/Token.bytecode.js similarity index 100% rename from packages/app/src/contracts/kovan/Token.bytecode.js rename to src/contracts/kovan/Token.bytecode.js diff --git a/packages/app/src/contracts/kovan/contracts.js b/src/contracts/kovan/contracts.js similarity index 100% rename from packages/app/src/contracts/kovan/contracts.js rename to src/contracts/kovan/contracts.js diff --git a/packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.abi.js b/src/contracts/mainnet/Active7DaysFundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.abi.js rename to src/contracts/mainnet/Active7DaysFundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.address.js b/src/contracts/mainnet/Active7DaysFundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.address.js rename to src/contracts/mainnet/Active7DaysFundingCycleBallot.address.js diff --git a/packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.bytecode.js b/src/contracts/mainnet/Active7DaysFundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/Active7DaysFundingCycleBallot.bytecode.js rename to src/contracts/mainnet/Active7DaysFundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/mainnet/FundingCycles.abi.js b/src/contracts/mainnet/FundingCycles.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/FundingCycles.abi.js rename to src/contracts/mainnet/FundingCycles.abi.js diff --git a/packages/app/src/contracts/mainnet/FundingCycles.address.js b/src/contracts/mainnet/FundingCycles.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/FundingCycles.address.js rename to src/contracts/mainnet/FundingCycles.address.js diff --git a/packages/app/src/contracts/mainnet/FundingCycles.bytecode.js b/src/contracts/mainnet/FundingCycles.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/FundingCycles.bytecode.js rename to src/contracts/mainnet/FundingCycles.bytecode.js diff --git a/packages/app/src/contracts/mainnet/Governance.abi.js b/src/contracts/mainnet/Governance.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/Governance.abi.js rename to src/contracts/mainnet/Governance.abi.js diff --git a/packages/app/src/contracts/mainnet/Governance.address.js b/src/contracts/mainnet/Governance.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/Governance.address.js rename to src/contracts/mainnet/Governance.address.js diff --git a/packages/app/src/contracts/mainnet/Governance.bytecode.js b/src/contracts/mainnet/Governance.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/Governance.bytecode.js rename to src/contracts/mainnet/Governance.bytecode.js diff --git a/packages/app/src/contracts/mainnet/ModStore.abi.js b/src/contracts/mainnet/ModStore.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/ModStore.abi.js rename to src/contracts/mainnet/ModStore.abi.js diff --git a/packages/app/src/contracts/mainnet/ModStore.address.js b/src/contracts/mainnet/ModStore.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/ModStore.address.js rename to src/contracts/mainnet/ModStore.address.js diff --git a/packages/app/src/contracts/mainnet/ModStore.bytecode.js b/src/contracts/mainnet/ModStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/ModStore.bytecode.js rename to src/contracts/mainnet/ModStore.bytecode.js diff --git a/packages/app/src/contracts/mainnet/OperatorStore.abi.js b/src/contracts/mainnet/OperatorStore.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/OperatorStore.abi.js rename to src/contracts/mainnet/OperatorStore.abi.js diff --git a/packages/app/src/contracts/mainnet/OperatorStore.address.js b/src/contracts/mainnet/OperatorStore.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/OperatorStore.address.js rename to src/contracts/mainnet/OperatorStore.address.js diff --git a/packages/app/src/contracts/mainnet/OperatorStore.bytecode.js b/src/contracts/mainnet/OperatorStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/OperatorStore.bytecode.js rename to src/contracts/mainnet/OperatorStore.bytecode.js diff --git a/packages/app/src/contracts/mainnet/Prices.abi.js b/src/contracts/mainnet/Prices.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/Prices.abi.js rename to src/contracts/mainnet/Prices.abi.js diff --git a/packages/app/src/contracts/mainnet/Prices.address.js b/src/contracts/mainnet/Prices.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/Prices.address.js rename to src/contracts/mainnet/Prices.address.js diff --git a/packages/app/src/contracts/mainnet/Prices.bytecode.js b/src/contracts/mainnet/Prices.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/Prices.bytecode.js rename to src/contracts/mainnet/Prices.bytecode.js diff --git a/packages/app/src/contracts/mainnet/Projects.abi.js b/src/contracts/mainnet/Projects.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/Projects.abi.js rename to src/contracts/mainnet/Projects.abi.js diff --git a/packages/app/src/contracts/mainnet/Projects.address.js b/src/contracts/mainnet/Projects.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/Projects.address.js rename to src/contracts/mainnet/Projects.address.js diff --git a/packages/app/src/contracts/mainnet/Projects.bytecode.js b/src/contracts/mainnet/Projects.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/Projects.bytecode.js rename to src/contracts/mainnet/Projects.bytecode.js diff --git a/packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.abi.js b/src/contracts/mainnet/ProxyPaymentAddressManager.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.abi.js rename to src/contracts/mainnet/ProxyPaymentAddressManager.abi.js diff --git a/packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.address.js b/src/contracts/mainnet/ProxyPaymentAddressManager.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.address.js rename to src/contracts/mainnet/ProxyPaymentAddressManager.address.js diff --git a/packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.bytecode.js b/src/contracts/mainnet/ProxyPaymentAddressManager.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/ProxyPaymentAddressManager.bytecode.js rename to src/contracts/mainnet/ProxyPaymentAddressManager.bytecode.js diff --git a/packages/app/src/contracts/mainnet/TerminalDirectory.abi.js b/src/contracts/mainnet/TerminalDirectory.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalDirectory.abi.js rename to src/contracts/mainnet/TerminalDirectory.abi.js diff --git a/packages/app/src/contracts/mainnet/TerminalDirectory.address.js b/src/contracts/mainnet/TerminalDirectory.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalDirectory.address.js rename to src/contracts/mainnet/TerminalDirectory.address.js diff --git a/packages/app/src/contracts/mainnet/TerminalDirectory.bytecode.js b/src/contracts/mainnet/TerminalDirectory.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalDirectory.bytecode.js rename to src/contracts/mainnet/TerminalDirectory.bytecode.js diff --git a/packages/app/src/contracts/mainnet/TerminalV1.abi.js b/src/contracts/mainnet/TerminalV1.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalV1.abi.js rename to src/contracts/mainnet/TerminalV1.abi.js diff --git a/packages/app/src/contracts/mainnet/TerminalV1.address.js b/src/contracts/mainnet/TerminalV1.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalV1.address.js rename to src/contracts/mainnet/TerminalV1.address.js diff --git a/packages/app/src/contracts/mainnet/TerminalV1.bytecode.js b/src/contracts/mainnet/TerminalV1.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/TerminalV1.bytecode.js rename to src/contracts/mainnet/TerminalV1.bytecode.js diff --git a/packages/app/src/contracts/mainnet/TicketBooth.abi.js b/src/contracts/mainnet/TicketBooth.abi.js similarity index 100% rename from packages/app/src/contracts/mainnet/TicketBooth.abi.js rename to src/contracts/mainnet/TicketBooth.abi.js diff --git a/packages/app/src/contracts/mainnet/TicketBooth.address.js b/src/contracts/mainnet/TicketBooth.address.js similarity index 100% rename from packages/app/src/contracts/mainnet/TicketBooth.address.js rename to src/contracts/mainnet/TicketBooth.address.js diff --git a/packages/app/src/contracts/mainnet/TicketBooth.bytecode.js b/src/contracts/mainnet/TicketBooth.bytecode.js similarity index 100% rename from packages/app/src/contracts/mainnet/TicketBooth.bytecode.js rename to src/contracts/mainnet/TicketBooth.bytecode.js diff --git a/packages/app/src/contracts/mainnet/contracts.js b/src/contracts/mainnet/contracts.js similarity index 100% rename from packages/app/src/contracts/mainnet/contracts.js rename to src/contracts/mainnet/contracts.js diff --git a/packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.abi.js b/src/contracts/rinkeby/Active14DaysFundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.abi.js rename to src/contracts/rinkeby/Active14DaysFundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.address.js b/src/contracts/rinkeby/Active14DaysFundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.address.js rename to src/contracts/rinkeby/Active14DaysFundingCycleBallot.address.js diff --git a/packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.bytecode.js b/src/contracts/rinkeby/Active14DaysFundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active14DaysFundingCycleBallot.bytecode.js rename to src/contracts/rinkeby/Active14DaysFundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.abi.js b/src/contracts/rinkeby/Active7DaysFundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.abi.js rename to src/contracts/rinkeby/Active7DaysFundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.address.js b/src/contracts/rinkeby/Active7DaysFundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.address.js rename to src/contracts/rinkeby/Active7DaysFundingCycleBallot.address.js diff --git a/packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.bytecode.js b/src/contracts/rinkeby/Active7DaysFundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Active7DaysFundingCycleBallot.bytecode.js rename to src/contracts/rinkeby/Active7DaysFundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Admin.abi.js b/src/contracts/rinkeby/Admin.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Admin.abi.js rename to src/contracts/rinkeby/Admin.abi.js diff --git a/packages/app/src/contracts/rinkeby/Admin.address.js b/src/contracts/rinkeby/Admin.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Admin.address.js rename to src/contracts/rinkeby/Admin.address.js diff --git a/packages/app/src/contracts/rinkeby/Admin.bytecode.js b/src/contracts/rinkeby/Admin.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Admin.bytecode.js rename to src/contracts/rinkeby/Admin.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/BudgetBallot.abi.js b/src/contracts/rinkeby/BudgetBallot.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetBallot.abi.js rename to src/contracts/rinkeby/BudgetBallot.abi.js diff --git a/packages/app/src/contracts/rinkeby/BudgetBallot.address.js b/src/contracts/rinkeby/BudgetBallot.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetBallot.address.js rename to src/contracts/rinkeby/BudgetBallot.address.js diff --git a/packages/app/src/contracts/rinkeby/BudgetBallot.bytecode.js b/src/contracts/rinkeby/BudgetBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetBallot.bytecode.js rename to src/contracts/rinkeby/BudgetBallot.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/BudgetStore.abi.js b/src/contracts/rinkeby/BudgetStore.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetStore.abi.js rename to src/contracts/rinkeby/BudgetStore.abi.js diff --git a/packages/app/src/contracts/rinkeby/BudgetStore.address.js b/src/contracts/rinkeby/BudgetStore.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetStore.address.js rename to src/contracts/rinkeby/BudgetStore.address.js diff --git a/packages/app/src/contracts/rinkeby/BudgetStore.bytecode.js b/src/contracts/rinkeby/BudgetStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/BudgetStore.bytecode.js rename to src/contracts/rinkeby/BudgetStore.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/DirectPayments.abi.js b/src/contracts/rinkeby/DirectPayments.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/DirectPayments.abi.js rename to src/contracts/rinkeby/DirectPayments.abi.js diff --git a/packages/app/src/contracts/rinkeby/DirectPayments.address.js b/src/contracts/rinkeby/DirectPayments.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/DirectPayments.address.js rename to src/contracts/rinkeby/DirectPayments.address.js diff --git a/packages/app/src/contracts/rinkeby/DirectPayments.bytecode.js b/src/contracts/rinkeby/DirectPayments.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/DirectPayments.bytecode.js rename to src/contracts/rinkeby/DirectPayments.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycleBallot.abi.js b/src/contracts/rinkeby/FundingCycleBallot.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycleBallot.abi.js rename to src/contracts/rinkeby/FundingCycleBallot.abi.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycleBallot.address.js b/src/contracts/rinkeby/FundingCycleBallot.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycleBallot.address.js rename to src/contracts/rinkeby/FundingCycleBallot.address.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycleBallot.bytecode.js b/src/contracts/rinkeby/FundingCycleBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycleBallot.bytecode.js rename to src/contracts/rinkeby/FundingCycleBallot.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycles.abi.js b/src/contracts/rinkeby/FundingCycles.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycles.abi.js rename to src/contracts/rinkeby/FundingCycles.abi.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycles.address.js b/src/contracts/rinkeby/FundingCycles.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycles.address.js rename to src/contracts/rinkeby/FundingCycles.address.js diff --git a/packages/app/src/contracts/rinkeby/FundingCycles.bytecode.js b/src/contracts/rinkeby/FundingCycles.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/FundingCycles.bytecode.js rename to src/contracts/rinkeby/FundingCycles.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Governance.abi.js b/src/contracts/rinkeby/Governance.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Governance.abi.js rename to src/contracts/rinkeby/Governance.abi.js diff --git a/packages/app/src/contracts/rinkeby/Governance.address.js b/src/contracts/rinkeby/Governance.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Governance.address.js rename to src/contracts/rinkeby/Governance.address.js diff --git a/packages/app/src/contracts/rinkeby/Governance.bytecode.js b/src/contracts/rinkeby/Governance.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Governance.bytecode.js rename to src/contracts/rinkeby/Governance.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.abi.js b/src/contracts/rinkeby/JuiceTerminalDirectory.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.abi.js rename to src/contracts/rinkeby/JuiceTerminalDirectory.abi.js diff --git a/packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.address.js b/src/contracts/rinkeby/JuiceTerminalDirectory.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.address.js rename to src/contracts/rinkeby/JuiceTerminalDirectory.address.js diff --git a/packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.bytecode.js b/src/contracts/rinkeby/JuiceTerminalDirectory.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/JuiceTerminalDirectory.bytecode.js rename to src/contracts/rinkeby/JuiceTerminalDirectory.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Juicer.abi.js b/src/contracts/rinkeby/Juicer.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Juicer.abi.js rename to src/contracts/rinkeby/Juicer.abi.js diff --git a/packages/app/src/contracts/rinkeby/Juicer.address.js b/src/contracts/rinkeby/Juicer.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Juicer.address.js rename to src/contracts/rinkeby/Juicer.address.js diff --git a/packages/app/src/contracts/rinkeby/Juicer.bytecode.js b/src/contracts/rinkeby/Juicer.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Juicer.bytecode.js rename to src/contracts/rinkeby/Juicer.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/ModStore.abi.js b/src/contracts/rinkeby/ModStore.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ModStore.abi.js rename to src/contracts/rinkeby/ModStore.abi.js diff --git a/packages/app/src/contracts/rinkeby/ModStore.address.js b/src/contracts/rinkeby/ModStore.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ModStore.address.js rename to src/contracts/rinkeby/ModStore.address.js diff --git a/packages/app/src/contracts/rinkeby/ModStore.bytecode.js b/src/contracts/rinkeby/ModStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ModStore.bytecode.js rename to src/contracts/rinkeby/ModStore.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/OperatorStore.abi.js b/src/contracts/rinkeby/OperatorStore.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/OperatorStore.abi.js rename to src/contracts/rinkeby/OperatorStore.abi.js diff --git a/packages/app/src/contracts/rinkeby/OperatorStore.address.js b/src/contracts/rinkeby/OperatorStore.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/OperatorStore.address.js rename to src/contracts/rinkeby/OperatorStore.address.js diff --git a/packages/app/src/contracts/rinkeby/OperatorStore.bytecode.js b/src/contracts/rinkeby/OperatorStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/OperatorStore.bytecode.js rename to src/contracts/rinkeby/OperatorStore.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Prices.abi.js b/src/contracts/rinkeby/Prices.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Prices.abi.js rename to src/contracts/rinkeby/Prices.abi.js diff --git a/packages/app/src/contracts/rinkeby/Prices.address.js b/src/contracts/rinkeby/Prices.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Prices.address.js rename to src/contracts/rinkeby/Prices.address.js diff --git a/packages/app/src/contracts/rinkeby/Prices.bytecode.js b/src/contracts/rinkeby/Prices.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Prices.bytecode.js rename to src/contracts/rinkeby/Prices.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Projects.abi.js b/src/contracts/rinkeby/Projects.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Projects.abi.js rename to src/contracts/rinkeby/Projects.abi.js diff --git a/packages/app/src/contracts/rinkeby/Projects.address.js b/src/contracts/rinkeby/Projects.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Projects.address.js rename to src/contracts/rinkeby/Projects.address.js diff --git a/packages/app/src/contracts/rinkeby/Projects.bytecode.js b/src/contracts/rinkeby/Projects.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Projects.bytecode.js rename to src/contracts/rinkeby/Projects.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.abi.js b/src/contracts/rinkeby/ProxyPaymentAddressManager.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.abi.js rename to src/contracts/rinkeby/ProxyPaymentAddressManager.abi.js diff --git a/packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.address.js b/src/contracts/rinkeby/ProxyPaymentAddressManager.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.address.js rename to src/contracts/rinkeby/ProxyPaymentAddressManager.address.js diff --git a/packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.bytecode.js b/src/contracts/rinkeby/ProxyPaymentAddressManager.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/ProxyPaymentAddressManager.bytecode.js rename to src/contracts/rinkeby/ProxyPaymentAddressManager.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/TerminalDirectory.abi.js b/src/contracts/rinkeby/TerminalDirectory.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalDirectory.abi.js rename to src/contracts/rinkeby/TerminalDirectory.abi.js diff --git a/packages/app/src/contracts/rinkeby/TerminalDirectory.address.js b/src/contracts/rinkeby/TerminalDirectory.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalDirectory.address.js rename to src/contracts/rinkeby/TerminalDirectory.address.js diff --git a/packages/app/src/contracts/rinkeby/TerminalDirectory.bytecode.js b/src/contracts/rinkeby/TerminalDirectory.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalDirectory.bytecode.js rename to src/contracts/rinkeby/TerminalDirectory.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/TerminalV1.abi.js b/src/contracts/rinkeby/TerminalV1.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalV1.abi.js rename to src/contracts/rinkeby/TerminalV1.abi.js diff --git a/packages/app/src/contracts/rinkeby/TerminalV1.address.js b/src/contracts/rinkeby/TerminalV1.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalV1.address.js rename to src/contracts/rinkeby/TerminalV1.address.js diff --git a/packages/app/src/contracts/rinkeby/TerminalV1.bytecode.js b/src/contracts/rinkeby/TerminalV1.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TerminalV1.bytecode.js rename to src/contracts/rinkeby/TerminalV1.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/TicketBooth.abi.js b/src/contracts/rinkeby/TicketBooth.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketBooth.abi.js rename to src/contracts/rinkeby/TicketBooth.abi.js diff --git a/packages/app/src/contracts/rinkeby/TicketBooth.address.js b/src/contracts/rinkeby/TicketBooth.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketBooth.address.js rename to src/contracts/rinkeby/TicketBooth.address.js diff --git a/packages/app/src/contracts/rinkeby/TicketBooth.bytecode.js b/src/contracts/rinkeby/TicketBooth.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketBooth.bytecode.js rename to src/contracts/rinkeby/TicketBooth.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/TicketStore.abi.js b/src/contracts/rinkeby/TicketStore.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketStore.abi.js rename to src/contracts/rinkeby/TicketStore.abi.js diff --git a/packages/app/src/contracts/rinkeby/TicketStore.address.js b/src/contracts/rinkeby/TicketStore.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketStore.address.js rename to src/contracts/rinkeby/TicketStore.address.js diff --git a/packages/app/src/contracts/rinkeby/TicketStore.bytecode.js b/src/contracts/rinkeby/TicketStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TicketStore.bytecode.js rename to src/contracts/rinkeby/TicketStore.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Tickets.abi.js b/src/contracts/rinkeby/Tickets.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Tickets.abi.js rename to src/contracts/rinkeby/Tickets.abi.js diff --git a/packages/app/src/contracts/rinkeby/Tickets.address.js b/src/contracts/rinkeby/Tickets.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Tickets.address.js rename to src/contracts/rinkeby/Tickets.address.js diff --git a/packages/app/src/contracts/rinkeby/Tickets.bytecode.js b/src/contracts/rinkeby/Tickets.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Tickets.bytecode.js rename to src/contracts/rinkeby/Tickets.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/TimelockStaker.abi.js b/src/contracts/rinkeby/TimelockStaker.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TimelockStaker.abi.js rename to src/contracts/rinkeby/TimelockStaker.abi.js diff --git a/packages/app/src/contracts/rinkeby/TimelockStaker.address.js b/src/contracts/rinkeby/TimelockStaker.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TimelockStaker.address.js rename to src/contracts/rinkeby/TimelockStaker.address.js diff --git a/packages/app/src/contracts/rinkeby/TimelockStaker.bytecode.js b/src/contracts/rinkeby/TimelockStaker.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/TimelockStaker.bytecode.js rename to src/contracts/rinkeby/TimelockStaker.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/Token.abi.js b/src/contracts/rinkeby/Token.abi.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Token.abi.js rename to src/contracts/rinkeby/Token.abi.js diff --git a/packages/app/src/contracts/rinkeby/Token.address.js b/src/contracts/rinkeby/Token.address.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Token.address.js rename to src/contracts/rinkeby/Token.address.js diff --git a/packages/app/src/contracts/rinkeby/Token.bytecode.js b/src/contracts/rinkeby/Token.bytecode.js similarity index 100% rename from packages/app/src/contracts/rinkeby/Token.bytecode.js rename to src/contracts/rinkeby/Token.bytecode.js diff --git a/packages/app/src/contracts/rinkeby/contracts.js b/src/contracts/rinkeby/contracts.js similarity index 100% rename from packages/app/src/contracts/rinkeby/contracts.js rename to src/contracts/rinkeby/contracts.js diff --git a/packages/app/src/contracts/ropsten/Admin.abi.js b/src/contracts/ropsten/Admin.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/Admin.abi.js rename to src/contracts/ropsten/Admin.abi.js diff --git a/packages/app/src/contracts/ropsten/Admin.address.js b/src/contracts/ropsten/Admin.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/Admin.address.js rename to src/contracts/ropsten/Admin.address.js diff --git a/packages/app/src/contracts/ropsten/Admin.bytecode.js b/src/contracts/ropsten/Admin.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/Admin.bytecode.js rename to src/contracts/ropsten/Admin.bytecode.js diff --git a/packages/app/src/contracts/ropsten/BudgetBallot.abi.js b/src/contracts/ropsten/BudgetBallot.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetBallot.abi.js rename to src/contracts/ropsten/BudgetBallot.abi.js diff --git a/packages/app/src/contracts/ropsten/BudgetBallot.address.js b/src/contracts/ropsten/BudgetBallot.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetBallot.address.js rename to src/contracts/ropsten/BudgetBallot.address.js diff --git a/packages/app/src/contracts/ropsten/BudgetBallot.bytecode.js b/src/contracts/ropsten/BudgetBallot.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetBallot.bytecode.js rename to src/contracts/ropsten/BudgetBallot.bytecode.js diff --git a/packages/app/src/contracts/ropsten/BudgetStore.abi.js b/src/contracts/ropsten/BudgetStore.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetStore.abi.js rename to src/contracts/ropsten/BudgetStore.abi.js diff --git a/packages/app/src/contracts/ropsten/BudgetStore.address.js b/src/contracts/ropsten/BudgetStore.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetStore.address.js rename to src/contracts/ropsten/BudgetStore.address.js diff --git a/packages/app/src/contracts/ropsten/BudgetStore.bytecode.js b/src/contracts/ropsten/BudgetStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/BudgetStore.bytecode.js rename to src/contracts/ropsten/BudgetStore.bytecode.js diff --git a/packages/app/src/contracts/ropsten/Fountain.abi.js b/src/contracts/ropsten/Fountain.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/Fountain.abi.js rename to src/contracts/ropsten/Fountain.abi.js diff --git a/packages/app/src/contracts/ropsten/Fountain.address.js b/src/contracts/ropsten/Fountain.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/Fountain.address.js rename to src/contracts/ropsten/Fountain.address.js diff --git a/packages/app/src/contracts/ropsten/Fountain.bytecode.js b/src/contracts/ropsten/Fountain.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/Fountain.bytecode.js rename to src/contracts/ropsten/Fountain.bytecode.js diff --git a/packages/app/src/contracts/ropsten/Juicer.abi.js b/src/contracts/ropsten/Juicer.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/Juicer.abi.js rename to src/contracts/ropsten/Juicer.abi.js diff --git a/packages/app/src/contracts/ropsten/Juicer.address.js b/src/contracts/ropsten/Juicer.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/Juicer.address.js rename to src/contracts/ropsten/Juicer.address.js diff --git a/packages/app/src/contracts/ropsten/Juicer.bytecode.js b/src/contracts/ropsten/Juicer.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/Juicer.bytecode.js rename to src/contracts/ropsten/Juicer.bytecode.js diff --git a/packages/app/src/contracts/ropsten/Maintainer.abi.js b/src/contracts/ropsten/Maintainer.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/Maintainer.abi.js rename to src/contracts/ropsten/Maintainer.abi.js diff --git a/packages/app/src/contracts/ropsten/Maintainer.address.js b/src/contracts/ropsten/Maintainer.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/Maintainer.address.js rename to src/contracts/ropsten/Maintainer.address.js diff --git a/packages/app/src/contracts/ropsten/Maintainer.bytecode.js b/src/contracts/ropsten/Maintainer.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/Maintainer.bytecode.js rename to src/contracts/ropsten/Maintainer.bytecode.js diff --git a/packages/app/src/contracts/ropsten/TicketStore.abi.js b/src/contracts/ropsten/TicketStore.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/TicketStore.abi.js rename to src/contracts/ropsten/TicketStore.abi.js diff --git a/packages/app/src/contracts/ropsten/TicketStore.address.js b/src/contracts/ropsten/TicketStore.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/TicketStore.address.js rename to src/contracts/ropsten/TicketStore.address.js diff --git a/packages/app/src/contracts/ropsten/TicketStore.bytecode.js b/src/contracts/ropsten/TicketStore.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/TicketStore.bytecode.js rename to src/contracts/ropsten/TicketStore.bytecode.js diff --git a/packages/app/src/contracts/ropsten/TimelockStaker.abi.js b/src/contracts/ropsten/TimelockStaker.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/TimelockStaker.abi.js rename to src/contracts/ropsten/TimelockStaker.abi.js diff --git a/packages/app/src/contracts/ropsten/TimelockStaker.address.js b/src/contracts/ropsten/TimelockStaker.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/TimelockStaker.address.js rename to src/contracts/ropsten/TimelockStaker.address.js diff --git a/packages/app/src/contracts/ropsten/TimelockStaker.bytecode.js b/src/contracts/ropsten/TimelockStaker.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/TimelockStaker.bytecode.js rename to src/contracts/ropsten/TimelockStaker.bytecode.js diff --git a/packages/app/src/contracts/ropsten/Token.abi.js b/src/contracts/ropsten/Token.abi.js similarity index 100% rename from packages/app/src/contracts/ropsten/Token.abi.js rename to src/contracts/ropsten/Token.abi.js diff --git a/packages/app/src/contracts/ropsten/Token.address.js b/src/contracts/ropsten/Token.address.js similarity index 100% rename from packages/app/src/contracts/ropsten/Token.address.js rename to src/contracts/ropsten/Token.address.js diff --git a/packages/app/src/contracts/ropsten/Token.bytecode.js b/src/contracts/ropsten/Token.bytecode.js similarity index 100% rename from packages/app/src/contracts/ropsten/Token.bytecode.js rename to src/contracts/ropsten/Token.bytecode.js diff --git a/packages/app/src/contracts/ropsten/contracts.js b/src/contracts/ropsten/contracts.js similarity index 100% rename from packages/app/src/contracts/ropsten/contracts.js rename to src/contracts/ropsten/contracts.js diff --git a/packages/app/src/declarations.d.ts b/src/declarations.d.ts similarity index 100% rename from packages/app/src/declarations.d.ts rename to src/declarations.d.ts diff --git a/packages/app/src/hooks/AppDispatch.tsx b/src/hooks/AppDispatch.tsx similarity index 100% rename from packages/app/src/hooks/AppDispatch.tsx rename to src/hooks/AppDispatch.tsx diff --git a/packages/app/src/hooks/AppSelector.tsx b/src/hooks/AppSelector.tsx similarity index 100% rename from packages/app/src/hooks/AppSelector.tsx rename to src/hooks/AppSelector.tsx diff --git a/packages/app/src/hooks/ContentType.tsx b/src/hooks/ContentType.tsx similarity index 100% rename from packages/app/src/hooks/ContentType.tsx rename to src/hooks/ContentType.tsx diff --git a/packages/app/src/hooks/ContractLoader.ts b/src/hooks/ContractLoader.ts similarity index 100% rename from packages/app/src/hooks/ContractLoader.ts rename to src/hooks/ContractLoader.ts diff --git a/packages/app/src/hooks/ContractReader.ts b/src/hooks/ContractReader.ts similarity index 100% rename from packages/app/src/hooks/ContractReader.ts rename to src/hooks/ContractReader.ts diff --git a/packages/app/src/hooks/CurrencyConverter.ts b/src/hooks/CurrencyConverter.ts similarity index 100% rename from packages/app/src/hooks/CurrencyConverter.ts rename to src/hooks/CurrencyConverter.ts diff --git a/packages/app/src/hooks/ERC20TokenBalance.tsx b/src/hooks/ERC20TokenBalance.tsx similarity index 100% rename from packages/app/src/hooks/ERC20TokenBalance.tsx rename to src/hooks/ERC20TokenBalance.tsx diff --git a/packages/app/src/hooks/Erc20Contract.ts b/src/hooks/Erc20Contract.ts similarity index 100% rename from packages/app/src/hooks/Erc20Contract.ts rename to src/hooks/Erc20Contract.ts diff --git a/packages/app/src/hooks/EthBalance.tsx b/src/hooks/EthBalance.tsx similarity index 100% rename from packages/app/src/hooks/EthBalance.tsx rename to src/hooks/EthBalance.tsx diff --git a/packages/app/src/hooks/EtherPrice.ts b/src/hooks/EtherPrice.ts similarity index 100% rename from packages/app/src/hooks/EtherPrice.ts rename to src/hooks/EtherPrice.ts diff --git a/packages/app/src/hooks/EventListener.ts b/src/hooks/EventListener.ts similarity index 100% rename from packages/app/src/hooks/EventListener.ts rename to src/hooks/EventListener.ts diff --git a/packages/app/src/hooks/GasPrice.ts b/src/hooks/GasPrice.ts similarity index 100% rename from packages/app/src/hooks/GasPrice.ts rename to src/hooks/GasPrice.ts diff --git a/packages/app/src/hooks/HasPermission.tsx b/src/hooks/HasPermission.tsx similarity index 100% rename from packages/app/src/hooks/HasPermission.tsx rename to src/hooks/HasPermission.tsx diff --git a/packages/app/src/hooks/JuiceTheme.tsx b/src/hooks/JuiceTheme.tsx similarity index 100% rename from packages/app/src/hooks/JuiceTheme.tsx rename to src/hooks/JuiceTheme.tsx diff --git a/packages/app/src/hooks/Poller.ts b/src/hooks/Poller.ts similarity index 100% rename from packages/app/src/hooks/Poller.ts rename to src/hooks/Poller.ts diff --git a/packages/app/src/hooks/ProjectMetadata.tsx b/src/hooks/ProjectMetadata.tsx similarity index 100% rename from packages/app/src/hooks/ProjectMetadata.tsx rename to src/hooks/ProjectMetadata.tsx diff --git a/packages/app/src/hooks/Projects.ts b/src/hooks/Projects.ts similarity index 100% rename from packages/app/src/hooks/Projects.ts rename to src/hooks/Projects.ts diff --git a/packages/app/src/hooks/Transactor.ts b/src/hooks/Transactor.ts similarity index 100% rename from packages/app/src/hooks/Transactor.ts rename to src/hooks/Transactor.ts diff --git a/packages/app/src/index.tsx b/src/index.tsx similarity index 100% rename from packages/app/src/index.tsx rename to src/index.tsx diff --git a/packages/app/src/models/child-elems.ts b/src/models/child-elems.ts similarity index 100% rename from packages/app/src/models/child-elems.ts rename to src/models/child-elems.ts diff --git a/packages/app/src/models/contract-name.ts b/src/models/contract-name.ts similarity index 100% rename from packages/app/src/models/contract-name.ts rename to src/models/contract-name.ts diff --git a/packages/app/src/models/contracts.ts b/src/models/contracts.ts similarity index 100% rename from packages/app/src/models/contracts.ts rename to src/models/contracts.ts diff --git a/packages/app/src/models/currency-option.ts b/src/models/currency-option.ts similarity index 100% rename from packages/app/src/models/currency-option.ts rename to src/models/currency-option.ts diff --git a/packages/app/src/models/funding-cycle-properties.ts b/src/models/funding-cycle-properties.ts similarity index 100% rename from packages/app/src/models/funding-cycle-properties.ts rename to src/models/funding-cycle-properties.ts diff --git a/packages/app/src/models/funding-cycle.ts b/src/models/funding-cycle.ts similarity index 100% rename from packages/app/src/models/funding-cycle.ts rename to src/models/funding-cycle.ts diff --git a/packages/app/src/models/label-val.ts b/src/models/label-val.ts similarity index 100% rename from packages/app/src/models/label-val.ts rename to src/models/label-val.ts diff --git a/packages/app/src/models/mods.ts b/src/models/mods.ts similarity index 100% rename from packages/app/src/models/mods.ts rename to src/models/mods.ts diff --git a/packages/app/src/models/network-name.ts b/src/models/network-name.ts similarity index 100% rename from packages/app/src/models/network-name.ts rename to src/models/network-name.ts diff --git a/packages/app/src/models/project-metadata.ts b/src/models/project-metadata.ts similarity index 100% rename from packages/app/src/models/project-metadata.ts rename to src/models/project-metadata.ts diff --git a/packages/app/src/models/project-type.ts b/src/models/project-type.ts similarity index 100% rename from packages/app/src/models/project-type.ts rename to src/models/project-type.ts diff --git a/packages/app/src/models/semantic-theme/colors.ts b/src/models/semantic-theme/colors.ts similarity index 100% rename from packages/app/src/models/semantic-theme/colors.ts rename to src/models/semantic-theme/colors.ts diff --git a/packages/app/src/models/semantic-theme/radii.ts b/src/models/semantic-theme/radii.ts similarity index 100% rename from packages/app/src/models/semantic-theme/radii.ts rename to src/models/semantic-theme/radii.ts diff --git a/packages/app/src/models/semantic-theme/theme.ts b/src/models/semantic-theme/theme.ts similarity index 100% rename from packages/app/src/models/semantic-theme/theme.ts rename to src/models/semantic-theme/theme.ts diff --git a/packages/app/src/models/subgraph-entities/distribute-to-payout-mod-event copy.ts b/src/models/subgraph-entities/distribute-to-payout-mod-event copy.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/distribute-to-payout-mod-event copy.ts rename to src/models/subgraph-entities/distribute-to-payout-mod-event copy.ts diff --git a/packages/app/src/models/subgraph-entities/distribute-to-ticket-mod-event.ts b/src/models/subgraph-entities/distribute-to-ticket-mod-event.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/distribute-to-ticket-mod-event.ts rename to src/models/subgraph-entities/distribute-to-ticket-mod-event.ts diff --git a/packages/app/src/models/subgraph-entities/pay-event.ts b/src/models/subgraph-entities/pay-event.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/pay-event.ts rename to src/models/subgraph-entities/pay-event.ts diff --git a/packages/app/src/models/subgraph-entities/payer-report.ts b/src/models/subgraph-entities/payer-report.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/payer-report.ts rename to src/models/subgraph-entities/payer-report.ts diff --git a/packages/app/src/models/subgraph-entities/print-reserves-event.ts b/src/models/subgraph-entities/print-reserves-event.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/print-reserves-event.ts rename to src/models/subgraph-entities/print-reserves-event.ts diff --git a/packages/app/src/models/subgraph-entities/project.ts b/src/models/subgraph-entities/project.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/project.ts rename to src/models/subgraph-entities/project.ts diff --git a/packages/app/src/models/subgraph-entities/redeem-event.ts b/src/models/subgraph-entities/redeem-event.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/redeem-event.ts rename to src/models/subgraph-entities/redeem-event.ts diff --git a/packages/app/src/models/subgraph-entities/tap-event.ts b/src/models/subgraph-entities/tap-event.ts similarity index 100% rename from packages/app/src/models/subgraph-entities/tap-event.ts rename to src/models/subgraph-entities/tap-event.ts diff --git a/packages/app/src/models/token-ref.ts b/src/models/token-ref.ts similarity index 100% rename from packages/app/src/models/token-ref.ts rename to src/models/token-ref.ts diff --git a/packages/app/src/models/tx-gas-option.ts b/src/models/tx-gas-option.ts similarity index 100% rename from packages/app/src/models/tx-gas-option.ts rename to src/models/tx-gas-option.ts diff --git a/packages/app/src/react-app-env.d.ts b/src/react-app-env.d.ts similarity index 100% rename from packages/app/src/react-app-env.d.ts rename to src/react-app-env.d.ts diff --git a/packages/app/src/redux/slices/editingProject.ts b/src/redux/slices/editingProject.ts similarity index 100% rename from packages/app/src/redux/slices/editingProject.ts rename to src/redux/slices/editingProject.ts diff --git a/packages/app/src/redux/store.ts b/src/redux/store.ts similarity index 100% rename from packages/app/src/redux/store.ts rename to src/redux/store.ts diff --git a/packages/app/src/reportWebVitals.ts b/src/reportWebVitals.ts similarity index 100% rename from packages/app/src/reportWebVitals.ts rename to src/reportWebVitals.ts diff --git a/packages/app/src/setupTests.ts b/src/setupTests.ts similarity index 100% rename from packages/app/src/setupTests.ts rename to src/setupTests.ts diff --git a/packages/app/src/styles/antd-overrides/button.scss b/src/styles/antd-overrides/button.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/button.scss rename to src/styles/antd-overrides/button.scss diff --git a/packages/app/src/styles/antd-overrides/collapse.scss b/src/styles/antd-overrides/collapse.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/collapse.scss rename to src/styles/antd-overrides/collapse.scss diff --git a/packages/app/src/styles/antd-overrides/description.scss b/src/styles/antd-overrides/description.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/description.scss rename to src/styles/antd-overrides/description.scss diff --git a/packages/app/src/styles/antd-overrides/drawer.scss b/src/styles/antd-overrides/drawer.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/drawer.scss rename to src/styles/antd-overrides/drawer.scss diff --git a/packages/app/src/styles/antd-overrides/index.scss b/src/styles/antd-overrides/index.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/index.scss rename to src/styles/antd-overrides/index.scss diff --git a/packages/app/src/styles/antd-overrides/input.scss b/src/styles/antd-overrides/input.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/input.scss rename to src/styles/antd-overrides/input.scss diff --git a/packages/app/src/styles/antd-overrides/layout.scss b/src/styles/antd-overrides/layout.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/layout.scss rename to src/styles/antd-overrides/layout.scss diff --git a/packages/app/src/styles/antd-overrides/menu-item.scss b/src/styles/antd-overrides/menu-item.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/menu-item.scss rename to src/styles/antd-overrides/menu-item.scss diff --git a/packages/app/src/styles/antd-overrides/modal.scss b/src/styles/antd-overrides/modal.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/modal.scss rename to src/styles/antd-overrides/modal.scss diff --git a/packages/app/src/styles/antd-overrides/notification.scss b/src/styles/antd-overrides/notification.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/notification.scss rename to src/styles/antd-overrides/notification.scss diff --git a/packages/app/src/styles/antd-overrides/picker.scss b/src/styles/antd-overrides/picker.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/picker.scss rename to src/styles/antd-overrides/picker.scss diff --git a/packages/app/src/styles/antd-overrides/progress.scss b/src/styles/antd-overrides/progress.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/progress.scss rename to src/styles/antd-overrides/progress.scss diff --git a/packages/app/src/styles/antd-overrides/slider.scss b/src/styles/antd-overrides/slider.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/slider.scss rename to src/styles/antd-overrides/slider.scss diff --git a/packages/app/src/styles/antd-overrides/space.scss b/src/styles/antd-overrides/space.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/space.scss rename to src/styles/antd-overrides/space.scss diff --git a/packages/app/src/styles/antd-overrides/spin.scss b/src/styles/antd-overrides/spin.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/spin.scss rename to src/styles/antd-overrides/spin.scss diff --git a/packages/app/src/styles/antd-overrides/statistic.scss b/src/styles/antd-overrides/statistic.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/statistic.scss rename to src/styles/antd-overrides/statistic.scss diff --git a/packages/app/src/styles/antd-overrides/step.scss b/src/styles/antd-overrides/step.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/step.scss rename to src/styles/antd-overrides/step.scss diff --git a/packages/app/src/styles/antd-overrides/switch.scss b/src/styles/antd-overrides/switch.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/switch.scss rename to src/styles/antd-overrides/switch.scss diff --git a/packages/app/src/styles/antd-overrides/tab.scss b/src/styles/antd-overrides/tab.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/tab.scss rename to src/styles/antd-overrides/tab.scss diff --git a/packages/app/src/styles/antd-overrides/timeline.scss b/src/styles/antd-overrides/timeline.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/timeline.scss rename to src/styles/antd-overrides/timeline.scss diff --git a/packages/app/src/styles/antd-overrides/tooltip.scss b/src/styles/antd-overrides/tooltip.scss similarity index 100% rename from packages/app/src/styles/antd-overrides/tooltip.scss rename to src/styles/antd-overrides/tooltip.scss diff --git a/packages/app/src/styles/antd.css b/src/styles/antd.css similarity index 100% rename from packages/app/src/styles/antd.css rename to src/styles/antd.css diff --git a/packages/app/src/styles/antd.less b/src/styles/antd.less similarity index 100% rename from packages/app/src/styles/antd.less rename to src/styles/antd.less diff --git a/packages/app/src/styles/blocknative-overrides.scss b/src/styles/blocknative-overrides.scss similarity index 100% rename from packages/app/src/styles/blocknative-overrides.scss rename to src/styles/blocknative-overrides.scss diff --git a/packages/app/src/styles/index.scss b/src/styles/index.scss similarity index 100% rename from packages/app/src/styles/index.scss rename to src/styles/index.scss diff --git a/packages/app/src/utils/bigNumbersDiff.ts b/src/utils/bigNumbersDiff.ts similarity index 100% rename from packages/app/src/utils/bigNumbersDiff.ts rename to src/utils/bigNumbersDiff.ts diff --git a/packages/app/src/utils/currency.ts b/src/utils/currency.ts similarity index 100% rename from packages/app/src/utils/currency.ts rename to src/utils/currency.ts diff --git a/packages/app/src/utils/deepEqFundingCycles.ts b/src/utils/deepEqFundingCycles.ts similarity index 100% rename from packages/app/src/utils/deepEqFundingCycles.ts rename to src/utils/deepEqFundingCycles.ts diff --git a/packages/app/src/utils/formatCurrency.ts b/src/utils/formatCurrency.ts similarity index 100% rename from packages/app/src/utils/formatCurrency.ts rename to src/utils/formatCurrency.ts diff --git a/packages/app/src/utils/formatDate.ts b/src/utils/formatDate.ts similarity index 100% rename from packages/app/src/utils/formatDate.ts rename to src/utils/formatDate.ts diff --git a/packages/app/src/utils/formatHandle.ts b/src/utils/formatHandle.ts similarity index 100% rename from packages/app/src/utils/formatHandle.ts rename to src/utils/formatHandle.ts diff --git a/packages/app/src/utils/formatNumber.ts b/src/utils/formatNumber.ts similarity index 100% rename from packages/app/src/utils/formatNumber.ts rename to src/utils/formatNumber.ts diff --git a/packages/app/src/utils/formatTime.ts b/src/utils/formatTime.ts similarity index 100% rename from packages/app/src/utils/formatTime.ts rename to src/utils/formatTime.ts diff --git a/packages/app/src/utils/fundingCycle.ts b/src/utils/fundingCycle.ts similarity index 100% rename from packages/app/src/utils/fundingCycle.ts rename to src/utils/fundingCycle.ts diff --git a/packages/app/src/utils/graph.ts b/src/utils/graph.ts similarity index 100% rename from packages/app/src/utils/graph.ts rename to src/utils/graph.ts diff --git a/packages/app/src/utils/ipfs.ts b/src/utils/ipfs.ts similarity index 100% rename from packages/app/src/utils/ipfs.ts rename to src/utils/ipfs.ts diff --git a/packages/app/src/utils/math.ts b/src/utils/math.ts similarity index 100% rename from packages/app/src/utils/math.ts rename to src/utils/math.ts diff --git a/packages/app/src/utils/onboard.ts b/src/utils/onboard.ts similarity index 100% rename from packages/app/src/utils/onboard.ts rename to src/utils/onboard.ts diff --git a/packages/app/src/utils/orEmpty.ts b/src/utils/orEmpty.ts similarity index 100% rename from packages/app/src/utils/orEmpty.ts rename to src/utils/orEmpty.ts diff --git a/packages/app/src/utils/serializers.ts b/src/utils/serializers.ts similarity index 100% rename from packages/app/src/utils/serializers.ts rename to src/utils/serializers.ts diff --git a/packages/app/tsconfig.json b/tsconfig.json similarity index 100% rename from packages/app/tsconfig.json rename to tsconfig.json diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index ae236e40ef..0000000000 --- a/yarn.lock +++ /dev/null @@ -1,23235 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ant-design/colors@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" - integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== - dependencies: - "@ctrl/tinycolor" "^3.4.0" - -"@ant-design/icons-svg@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" - integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== - -"@ant-design/icons@^4.6.2": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.6.2.tgz#290f2e8cde505ab081fda63e511e82d3c48be982" - integrity sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A== - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons-svg" "^4.0.0" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.9.4" - -"@ant-design/react-slick@~0.28.1": - version "0.28.3" - resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.28.3.tgz#ad5cf1cf50363c1a3842874d69d0ce1f26696e71" - integrity sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg== - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.0" - -"@apocentre/alias-sampling@^0.5.3": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" - integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== - -"@babel/code-frame@7.10.4": - 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/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" - integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== - -"@babel/core@7.12.3": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" - integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.3" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - 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/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" - integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.6" - "@babel/parser" "^7.14.6" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.12.1", "@babel/generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== - dependencies: - "@babel/types" "^7.14.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" - integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" - integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" - integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" - integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.10.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" - integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-wrap-function" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" - integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" - integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helpers@^7.12.1", "@babel/helpers@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" - integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.7.0": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" - integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" - integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" - integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" - integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" - integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-decorators" "^7.12.1" - -"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" - integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" - integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== - dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.5" - -"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" - integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" - integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": - 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-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" - integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - 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-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" - integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": - 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-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" - integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - 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", "@babel/plugin-syntax-numeric-separator@^7.8.3": - 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.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - 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", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - 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", "@babel/plugin-syntax-optional-chaining@^7.8.3": - 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-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - -"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" - integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" - integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-flow-strip-types@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" - integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-flow" "^7.12.1" - -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" - integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" - integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== - dependencies: - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" - integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - -"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" - integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz#41790d856f7c5cec82d2bcf5d0e5064d682522ed" - integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-display-name@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" - integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz#baa92d15c4570411301a85a74c13534873885b65" - integrity sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" - integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.14.5" - -"@babel/plugin-transform-react-jsx-self@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz#703b5d1edccd342179c2a99ee8c7065c2b4403cc" - integrity sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-source@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz#79f728e60e6dbd31a2b860b0bf6c9765918acf1d" - integrity sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz#39749f0ee1efd8a1bd729152cf5f78f1d247a44a" - integrity sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/plugin-transform-react-pure-annotations@^7.12.1", "@babel/plugin-transform-react-pure-annotations@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" - integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" - integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-runtime@^7.5.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" - integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" - integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - -"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.12.1": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" - integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.6" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" - integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== - dependencies: - "@babel/compat-data" "^7.12.1" - "@babel/helper-compilation-targets" "^7.12.1" - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.1" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@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.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.1" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.1" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.1" - core-js-compat "^3.6.2" - semver "^5.5.0" - -"@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a" - integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA== - dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.7" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.14.5" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.5" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.14.5" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.14.5" - "@babel/plugin-transform-modules-systemjs" "^7.14.5" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.15.0" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== - 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/preset-react@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" - integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.1" - "@babel/plugin-transform-react-jsx-development" "^7.12.1" - "@babel/plugin-transform-react-jsx-self" "^7.12.1" - "@babel/plugin-transform-react-jsx-source" "^7.12.1" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" - -"@babel/preset-react@^7.9.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" - integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.14.5" - "@babel/plugin-transform-react-jsx" "^7.14.5" - "@babel/plugin-transform-react-jsx-development" "^7.14.5" - "@babel/plugin-transform-react-pure-annotations" "^7.14.5" - -"@babel/preset-typescript@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz#86480b483bb97f75036e8864fe404cc782cc311b" - integrity sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-typescript" "^7.12.1" - -"@babel/runtime-corejs3@^7.10.2": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz#0ef292bbce40ca00f874c9724ef175a12476465c" - integrity sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA== - dependencies: - core-js-pure "^3.15.0" - regenerator-runtime "^0.13.4" - -"@babel/runtime@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" - integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.10.4", "@babel/template@^7.14.5", "@babel/template@^7.3.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.7.0": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" - integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.7" - "@babel/types" "^7.14.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.4.tgz#74eeb86dbd6748d2741396557b9860e57fce0a0d" - integrity sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@chainlink/contracts@^0.1.6": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.1.9.tgz#b2e77b87d7eea737cd668c4c727660e7b55cd236" - integrity sha512-7UIqkdzarbK876YZAiGKeYj/ujG3FPVVxWLACxbdyacM+ryIAgcZMkaaavt5+NwVXJvVjwWmucWTDCTy0JP8ag== - optionalDependencies: - "@truffle/contract" "^4.3.8" - ethers "^4.0.45" - -"@chaitanyapotti/random-id@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@chaitanyapotti/random-id/-/random-id-1.0.3.tgz#f52f647cfe9f79fc7723ea2b01b0ad3889204002" - integrity sha512-xiVWA2vTL3jQeuZ+yebXAtwIeEbh/13RAFxvRq0YxeUc02RBOGyC9eyDKXjwlN0uxPtnEwWxsELkSwnaH5kxjg== - -"@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" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@csstools/normalize.css@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" - integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== - -"@ctrl/tinycolor@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" - integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== - -"@cvbb/bc-bech32@^1.1.15": - version "1.1.15" - resolved "https://registry.yarnpkg.com/@cvbb/bc-bech32/-/bc-bech32-1.1.15.tgz#f337e1046ee8ee9256b11ab25efaf4c1311bd04a" - integrity sha512-e80x5VsfUCpXYiheLm/c/lOEegr7ZSd5nq3HlJEcfgljXW5LosH/Kgf21he9Yyr2cBke3NrZM7DuOxvbMpPJHg== - -"@cvbb/bc-ur@^0.2.14": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@cvbb/bc-ur/-/bc-ur-0.2.15.tgz#fc2f057b740c86c25b16d60f0ca7f97afd228ba7" - integrity sha512-jukQNKCzv1zxUsESeCbVV2Mkxmgz03yVmtgjPpqJ0D1HhNUz8pBt7tmLVOvAO1eeK4Q0083maebxv3r7p2uadA== - dependencies: - "@cvbb/bc-bech32" "^1.1.15" - "@types/sha.js" "^2.4.0" - sha.js "^2.4.11" - -"@cvbb/eth-keyring@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cvbb/eth-keyring/-/eth-keyring-1.1.1.tgz#e681810e7f74d8682f6ee9b8f3844d5bbc9ef02f" - integrity sha512-HhSiHY3chN4nx1tajLD5v0obdr5GdIVGdLGCEOP8rG0f0Tu6bOJBqJE/idDii8C7mtxEijquyfyuPHHNfa8xKg== - dependencies: - "@cvbb/sdk" "^1.1.1" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^7.0.8" - hdkey "^2.0.1" - -"@cvbb/sdk@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cvbb/sdk/-/sdk-1.1.1.tgz#a8343feff0a8e5781a60095c01895c86c1c58d5e" - integrity sha512-aEx914et/V/CXREVZiMrrS4VprCNFPsabTNZTzqNJOrMsOpABk0gwJHi55D+FaAsqIDK7PTLzkPjR59Iorol6Q== - dependencies: - "@cvbb/bc-ur" "^0.2.14" - "@types/qrcode.react" "^1.0.1" - "@types/react-dom" "^17.0.1" - "@types/react-modal" "^3.12.0" - "@types/react-qr-reader" "^2.1.3" - qrcode.react "^1.0.1" - react "^17.0.1" - react-dom "^17.0.1" - react-modal "^3.12.1" - react-qr-reader "^2.2.1" - rxjs "^6.6.3" - -"@ensdomains/address-encoder@^0.1.7": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" - integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== - dependencies: - bech32 "^1.1.3" - blakejs "^1.1.0" - bn.js "^4.11.8" - bs58 "^4.0.1" - crypto-addr-codec "^0.1.7" - nano-base32 "^1.0.1" - ripemd160 "^2.0.2" - -"@ensdomains/ens@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.3.tgz#f4a6b55146fe526c9a50e13f373bf90d36ca94dc" - integrity sha512-btC+fGze//ml8SMNCx5DgwM8+kG2t+qDCZrqlL/2+PV4CNxnRIpR3egZ49D9FqS52PFoYLmz6MaQfl7AO3pUMA== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - ethereumjs-testrpc "^6.0.3" - ganache-cli "^6.1.0" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/ensjs@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.0.1.tgz#c27438f9ca074825ddb08430988c7decf2062a91" - integrity sha512-gZLntzE1xqPNkPvaHdJlV5DXHms8JbHBwrXc2xNrL1AylERK01Lj/txCCZyVQqFd3TvUO1laDbfUv8VII0qrjg== - dependencies: - "@babel/runtime" "^7.4.4" - "@ensdomains/address-encoder" "^0.1.7" - "@ensdomains/ens" "0.4.3" - "@ensdomains/resolver" "0.2.4" - content-hash "^2.5.2" - eth-ens-namehash "^2.0.8" - ethers "^5.0.13" - js-sha3 "^0.8.0" - -"@ensdomains/resolver@0.2.4", "@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - -"@eslint/eslintrc@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" - integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@ethereum-waffle/chai@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.0.tgz#2477877410a96bf370edd64df905b04fb9aba9d5" - integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g== - dependencies: - "@ethereum-waffle/provider" "^3.4.0" - ethers "^5.0.0" - -"@ethereum-waffle/compiler@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284" - integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw== - dependencies: - "@resolver-engine/imports" "^0.3.3" - "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" - "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.5.5" - ethers "^5.0.1" - mkdirp "^0.5.1" - node-fetch "^2.6.1" - solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" - -"@ethereum-waffle/ens@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791" - integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw== - dependencies: - "@ensdomains/ens" "^0.4.4" - "@ensdomains/resolver" "^0.2.4" - ethers "^5.0.1" - -"@ethereum-waffle/mock-contract@^3.2.2", "@ethereum-waffle/mock-contract@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a" - integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw== - dependencies: - "@ethersproject/abi" "^5.0.1" - ethers "^5.0.1" - -"@ethereum-waffle/provider@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00" - integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ== - dependencies: - "@ethereum-waffle/ens" "^3.3.0" - ethers "^5.0.1" - ganache-core "^2.13.2" - patch-package "^6.2.2" - postinstall-postinstall "^2.1.0" - -"@ethereumjs/block@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.4.0.tgz#4747b0c06220ee10cbdfe1cbde8cbb0677b1b074" - integrity sha512-umKAoTX32yXzErpIksPHodFc/5y8bmZMnOl6hWy5Vd8xId4+HKFUOyEiN16Y97zMwFRysRpcrR6wBejfqc6Bmg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - ethereumjs-util "^7.1.0" - merkle-patricia-tree "^4.2.0" - -"@ethereumjs/blockchain@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.0.tgz#28d712627d3442b2bb1f50dd5acba7cde1021993" - integrity sha512-wAuKLaew6PL52kH8YPXO7PbjjKV12jivRSyHQehkESw4slSLLfYA6Jv7n5YxyT2ajD7KNMPVh7oyF/MU6HcOvg== - dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/ethash" "^1.0.0" - debug "^2.2.0" - ethereumjs-util "^7.1.0" - level-mem "^5.0.1" - lru-cache "^5.1.1" - rlp "^2.2.4" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.0.0", "@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766" - integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.0" - -"@ethereumjs/ethash@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" - integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw== - dependencies: - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.7" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.0.0.tgz#8dfd91ed6e91e63996e37b3ddc340821ebd48c81" - integrity sha512-H9tfy6qgYxPXvt1TSObfVmVjlF43OoQqoPQ3PJsG2JiuqaMHj5ettV1pGFEC3FamENDBkl6vD6niQEvIlXv/VQ== - dependencies: - "@ethereumjs/common" "^2.0.0" - ethereumjs-util "^7.0.7" - -"@ethereumjs/tx@^3.0.0", "@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378" - integrity sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA== - dependencies: - "@ethereumjs/common" "^2.4.0" - ethereumjs-util "^7.1.0" - -"@ethereumjs/vm@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.0.tgz#d389c5792320ef28c51366a643b8ab9d64e10a31" - integrity sha512-h6Kr6WqKUP8nVuEzCWPWEPrC63v7HFwt3gRuK7CJiyg9S0iWSBKUA/YVD4YgaSVACuxUfWaOBbwV5uGVupm5PQ== - dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/blockchain" "^5.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^2.2.0" - ethereumjs-util "^7.1.0" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.0" - rustbn.js "~0.2.0" - util.promisify "^1.0.1" - -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242" - integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/abstract-provider@5.4.0", "@ethersproject/abstract-provider@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d" - integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-provider@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-signer@5.4.0", "@ethersproject/abstract-signer@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65" - integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/abstract-signer@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/address@5.4.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - -"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== - dependencies: - "@ethersproject/bytes" "^5.4.0" - -"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" - integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/bignumber@5.4.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9" - integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d" - integrity sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/constants@5.4.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - -"@ethersproject/contracts@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb" - integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/contracts@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" - integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/hash@5.4.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" - integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" - integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" - -"@ethersproject/logger@5.4.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" - integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== - -"@ethersproject/networks@5.4.1", "@ethersproject/networks@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.1.tgz#2ce83b8e42aa85216e5d277a7952d97b6ce8d852" - integrity sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/networks@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" - integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - -"@ethersproject/properties@5.4.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" - integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/providers@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.1.tgz#654267b563b833046b9c9647647cfc8267cb93b4" - integrity sha512-p06eiFKz8nu/5Ju0kIX024gzEQIgE5pvvGrBCngpyVjpuLtUIWT3097Agw4mTn9/dEA0FMcfByzFqacBMSgCVg== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795" - integrity sha512-mQevyXj2X2D3l8p/JGDYFZbODhZjW6On15DnCK4Xc9y6b+P0vqorQC/j46omWSm4cyo7BQ/rgfhXNYmvAfyZoQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" - integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" - integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" - integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/strings@5.4.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/units@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" - integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/wallet@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" - integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/json-wallets" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" - integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@gnosis.pm/mock-contract@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/mock-contract/-/mock-contract-4.0.0.tgz#eaf500fddcab81b5f6c22280a7b22ff891dd6f87" - integrity sha512-SkRq2KwPx6vo0LAjSc8JhgQstrQFXRyn2yqquIfub7r2WHi5nUbF8beeSSXsd36hvBcQxQfmOIYNYRpj9JOhrQ== - -"@gnosis.pm/safe-apps-provider@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-provider/-/safe-apps-provider-0.5.0.tgz#e0121553ef22c1458eb95cf0afed14e8c2570ae3" - integrity sha512-c4OuKV+cIW2aDmv0DZfLOelmyNNZz5Dr3OG5TvnCfmYhZtHyOd1x6bd2xnROCuiZU+QAUGJsm65mBe6iy8NAVQ== - dependencies: - "@gnosis.pm/safe-apps-sdk" "3.0.0" - events "^3.3.0" - -"@gnosis.pm/safe-apps-sdk@3.0.0", "@gnosis.pm/safe-apps-sdk@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-3.0.0.tgz#0f90185c3693f2683322d275e796e61ff99ce87d" - integrity sha512-dLCSlniYnxEqCglx4XdhByvi7KKuSYRWJKm1lVXAc4oJqwwVkoCwp0bFIejLZ/dnf7cQSBUUVsTGWhvSda511w== - -"@graphprotocol/graph-cli@0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.21.0.tgz#628064ebfef4f41594f50c9811514ed8b24ea69d" - integrity sha512-qQNlPCe+HKXscymrVI366gKeSzPAY5N/yXDkGSPzNDiBzi2VfV1CUyVgTibeLtcp3XZE4pxtcyCmdHWqnK3xGw== - dependencies: - assemblyscript "git+https://github.com/AssemblyScript/assemblyscript.git#v0.6" - chalk "^3.0.0" - chokidar "^3.0.2" - debug "^4.1.1" - docker-compose "^0.23.2" - dockerode "^2.5.8" - fs-extra "^9.0.0" - glob "^7.1.2" - gluegun "^4.3.1" - graphql "^15.5.0" - immutable "^3.8.2" - ipfs-http-client "^34.0.0" - jayson "^3.0.2" - js-yaml "^3.13.1" - node-fetch "^2.3.0" - pkginfo "^0.4.1" - prettier "^1.13.5" - request "^2.88.0" - tmp-promise "^3.0.2" - yaml "^1.5.1" - -"@graphprotocol/graph-ts@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-ts/-/graph-ts-0.20.0.tgz#ed31ffd59a6aa9703a1ec5079f137a81220443cb" - integrity sha512-+R0Tu/MD4Fiq0Fo+v1l+xznz+ZrciQKWlzMtXjDrhM70vlMNVL9wDmf90MVFYpslgqIfw024hT6XwlmyNyOWbQ== - dependencies: - assemblyscript "https://github.com/AssemblyScript/assemblyscript#36040d5b5312f19a025782b5e36663823494c2f3" - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/joi@^15.1.0": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" - slash "^3.0.0" - -"@jest/core@^26.6.0", "@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" - -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" - -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^26.6.0", "@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@keepkey/device-protocol@^7.2.1": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@keepkey/device-protocol/-/device-protocol-7.2.4.tgz#442b0ed445476ddcbe0fa28c7526f6c85e288457" - integrity sha512-81vUzr8FcGyGByj+JQvVJnXBtkeIpPERBh/wlFLVgwE95UjnMbMki/sfUOsLAzg0Afx7gO/sZ4M1cX9iKuFCRg== - dependencies: - google-protobuf "^3.7.0-rc.2" - pbjs "^0.0.5" - -"@keystonehq/bc-ur-registry-eth@^0.6.8": - version "0.6.8" - resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry-eth/-/bc-ur-registry-eth-0.6.8.tgz#1cbb661a25a27f3b0d68ad0644883c2521b4bbc1" - integrity sha512-JluftBw7BbK2v/Lv3j9nwr5QWqXnDbIGB/7FLKwrniKpMCihbA/Lpr0lK6vOqo2+7bReJ7yXMm2LOaXSEdQ+hw== - dependencies: - "@keystonehq/bc-ur-registry" "^0.4.4" - ethereumjs-util "^7.0.8" - hdkey "^2.0.1" - uuid "^8.3.2" - -"@keystonehq/bc-ur-registry@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.4.4.tgz#3073fdd4b33cdcbd04526a313a7685891a4b4583" - integrity sha512-SBdKdAZfp3y14GTGrKjfJJHf4iXObjcm4/qKUZ92lj8HVR8mxHHGmHksjE328bJPTAsJPloLix4rTnWg+qgS2w== - dependencies: - "@ngraveio/bc-ur" "^1.1.5" - base58check "^2.0.0" - tslib "^2.3.0" - -"@keystonehq/eth-keyring@0.7.7": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@keystonehq/eth-keyring/-/eth-keyring-0.7.7.tgz#c22612e40dbf45fee875c09bf0ee332b3d580cb0" - integrity sha512-BAfiUKu7vc8GlUpA+ZUA4nVOXGFx3CyO3sOrRdv5/wtTLE0SbcOYSQKrYUop2ERHbhcOilGOtuJfu/vwkOk1cA== - dependencies: - "@ethereumjs/tx" "3.0.0" - "@keystonehq/bc-ur-registry-eth" "^0.6.8" - "@keystonehq/sdk" "^0.7.8" - bs58check "^2.1.2" - ethereumjs-util "^7.0.8" - hdkey "^2.0.1" - uuid "^8.3.2" - -"@keystonehq/sdk@^0.7.8": - version "0.7.8" - resolved "https://registry.yarnpkg.com/@keystonehq/sdk/-/sdk-0.7.8.tgz#1d808c4c59bd7a58d29c3f7fb2df10beb38a4c3f" - integrity sha512-WlrKftKYsdNopKqMwP+FZRFX2VBfkUC0T3NeaNg9f8RsFokeYXqYd/E4TSbv1dYY9R+jAvRqSzz44g5H2RPIlg== - dependencies: - "@ngraveio/bc-ur" "^1.0.0" - "@types/qrcode.react" "^1.0.1" - "@types/react-dom" "^17.0.9" - "@types/react-modal" "^3.12.0" - "@types/react-qr-reader" "^2.1.3" - qrcode.react "^1.0.1" - react "16.13.1" - react-dom "16.13.1" - react-modal "^3.12.1" - react-qr-reader "^2.2.1" - rxjs "^6.6.3" - -"@ledgerhq/cryptoassets@^5.53.0": - version "5.53.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58" - integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw== - dependencies: - invariant "2" - -"@ledgerhq/devices@^5.51.1": - version "5.51.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7" - integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== - dependencies: - "@ledgerhq/errors" "^5.50.0" - "@ledgerhq/logs" "^5.50.0" - rxjs "6" - semver "^7.3.5" - -"@ledgerhq/errors@^5.34.0", "@ledgerhq/errors@^5.50.0": - version "5.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9" - integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== - -"@ledgerhq/hw-app-eth@^5.49.0": - version "5.53.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.53.0.tgz#5df2d7427db9f387099d0cc437e9730101d7c404" - integrity sha512-LKi/lDA9tW0GdoYP1ng0VY/PXNYjSrwZ1cj0R0MQ9z+knmFlPcVkGK2MEqE8W8cXrC0tjsUXITMcngvpk5yfKA== - dependencies: - "@ledgerhq/cryptoassets" "^5.53.0" - "@ledgerhq/errors" "^5.50.0" - "@ledgerhq/hw-transport" "^5.51.1" - "@ledgerhq/logs" "^5.50.0" - bignumber.js "^9.0.1" - ethers "^5.2.0" - -"@ledgerhq/hw-transport-u2f@^5.21.0": - version "5.34.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.34.0.tgz#53466e4f07e177ec29b1ea061b6c56a57439a0cd" - integrity sha512-EM6LcbdD6Xo/msedbAWalBZlv89XAZrAZwL5zN9eKlUcWPjjG8c9+t5NedR/jmIaGuzIUVseUCIRxczqd5byOw== - dependencies: - "@ledgerhq/errors" "^5.34.0" - "@ledgerhq/hw-transport" "^5.34.0" - "@ledgerhq/logs" "^5.30.0" - u2f-api "0.2.7" - -"@ledgerhq/hw-transport-webusb@5.53.0": - version "5.53.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.53.0.tgz#1ed29f81f901e50b2b0a448c9d52f33bb44ca116" - integrity sha512-ht5masmuSmDlonuSaYcgGMqgz9GCDm0zX6dK0n2UlVZ7RCixuABY5M5pzMmVTBocqHCydbSDSJDFZOHqNlJ/4g== - dependencies: - "@ledgerhq/devices" "^5.51.1" - "@ledgerhq/errors" "^5.50.0" - "@ledgerhq/hw-transport" "^5.51.1" - "@ledgerhq/logs" "^5.50.0" - -"@ledgerhq/hw-transport@^5.34.0", "@ledgerhq/hw-transport@^5.51.1": - version "5.51.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578" - integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== - dependencies: - "@ledgerhq/devices" "^5.51.1" - "@ledgerhq/errors" "^5.50.0" - events "^3.3.0" - -"@ledgerhq/logs@^5.30.0", "@ledgerhq/logs@^5.50.0": - version "5.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" - integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== - -"@metamask/obs-store@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@metamask/obs-store/-/obs-store-7.0.0.tgz#6cae5f28306bb3e83a381bc9ae22682316095bd3" - integrity sha512-Tr61Uu9CGXkCg5CZwOYRMQERd+y6fbtrtLd/PzDTPHO5UJpmSbU+7MPcQK7d1DwZCOCeCIvhmZSUCvYliC8uGw== - dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - through2 "^2.0.3" - -"@metamask/post-message-stream@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@metamask/post-message-stream/-/post-message-stream-4.0.0.tgz#72f120e562346ca86ccc9b3684023ad44265f0df" - integrity sha512-r0JcoWXNuHycProx8ClxiIElJY/GVb/0/WWXTMsZu7qDejLo52VNXlwfydCdVjbMXeoT2nK1Yt3d5gjmHy5BWw== - dependencies: - readable-stream "2.3.3" - -"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" - integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== - -"@myetherwallet/mewconnect-web-client@^2.2.0-beta.11": - version "2.2.0-beta.12" - resolved "https://registry.yarnpkg.com/@myetherwallet/mewconnect-web-client/-/mewconnect-web-client-2.2.0-beta.12.tgz#19147f2b7eec34c03fdbbb71d8f347b8d9c4f3ac" - integrity sha512-/UsQvCpNYOlpr2pWG3w2+UMxknUSQILOiYBm0KGuOuWTRz9ElOyaVjg0cAfbEUVhuWRlZxl03n162LdFq4xxpQ== - dependencies: - "@rollup/plugin-babel" "^5.3.0" - "@rollup/plugin-commonjs" "^20.0.0" - "@rollup/plugin-json" "^4.1.0" - bignumber.js "^9.0.0" - browser-or-node "^1.2.1" - core-js "^3.4.4" - debug "^4.0.1" - detect-browser "^3.0.1" - eccrypto "^1.1.6" - eth-sig-util "^3.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-utils "^5.2.5" - ethjs-unit "^0.1.6" - events "^3.1.0" - isomorphic-ws "^4.0.1" - logging "^3.2.0" - mocha "^5.2.0" - node-fetch "^2.6.0" - platform "^1.3.5" - promise-ws "^1.0.0-1" - qrcode "^1.4.4" - query-string "^6.10.1" - secp256k1 "^3.8.0" - simple-peer "^9.6.2" - socket.io-client "^2.3.0" - store "^2.0.12" - underscore latest - uuid "^3.4.0" - vue "^2.6.10" - web3 "1.5.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-core-requestmanager "1.5.0" - web3-utils "1.5.0" - webrtc-adapter "^6.4.3" - wrtc "^0.4.6" - ws "^7.5.3" - -"@ngraveio/bc-ur@^1.0.0", "@ngraveio/bc-ur@^1.1.5": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@ngraveio/bc-ur/-/bc-ur-1.1.6.tgz#8f8c75fff22f6a5e4dfbc5a6b540d7fe8f42cd39" - integrity sha512-G+2XgjXde2IOcEQeCwR250aS43/Swi7gw0FuETgJy2c3HqF8f88SXDMsIGgJlZ8jXd0GeHR4aX0MfjXf523UZg== - dependencies: - "@apocentre/alias-sampling" "^0.5.3" - assert "^2.0.0" - bignumber.js "^9.0.1" - cbor-sync "^1.0.4" - crc "^3.8.0" - jsbi "^3.1.5" - sha.js "^2.4.11" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nomiclabs/hardhat-ethers@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" - integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== - -"@nomiclabs/hardhat-etherscan@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.4.tgz#510b6a669cc2dad095466b2ba9ae0b411c779081" - integrity sha512-KgFNTQv9gpioiTpQ9UlTysCAFfkcBonmEn9rVPTT22A7DRENFM1VTsVeGWF3AzRhd0mrASBF+o0gvbH30pSe0Q== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" - debug "^4.1.1" - fs-extra "^7.0.1" - node-fetch "^2.6.0" - semver "^6.3.0" - -"@nomiclabs/hardhat-waffle@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2" - integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ== - dependencies: - "@types/sinon-chai" "^3.2.3" - "@types/web3" "1.0.19" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@openzeppelin/contracts@^4.1.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.2.0.tgz#260d921d99356e48013d9d760caaa6cea35dc642" - integrity sha512-LD4NnkKpHHSMo5z9MvFsG4g1xxZUDqV3A3Futu3nvyfs4wPwXxqOgMaxOoa2PeyGL2VNeSlbxT54enbQzGcgJQ== - -"@paulrberg/contracts@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@paulrberg/contracts/-/contracts-3.4.0.tgz#ce6bb7c1b425f5a3a60258aef96e573537f9c608" - integrity sha512-wh9mKkEZ1nZ9T7/ymxEUHVQcunfybl3kP/u63RBrwYqASK6cB+pU+aCBvb1X2Yfde461L4LkJpC7Z3BIbFUvfA== - dependencies: - prb-math "^2.2.0" - -"@pmmmwh/react-refresh-webpack-plugin@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d" - integrity sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A== - dependencies: - ansi-html "^0.0.7" - error-stack-parser "^2.0.6" - html-entities "^1.2.1" - native-url "^0.2.6" - schema-utils "^2.6.5" - source-map "^0.7.3" - -"@portis/web3@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-4.0.5.tgz#7931ac129c2ba7e75a8c451434fc5765bed1a5fe" - integrity sha512-H4spuHI4gDILHS/SjznTBn4t0/qE+UgYc7yi6/kX2oSFe8G12F0xiON7orkx7vpU+8tI9rf4VNe/Gt1fyeDgNw== - dependencies: - ethereumjs-util "5.2.0" - penpal "3.0.7" - pocket-js-core "0.0.3" - web3-provider-engine "16.0.1" - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - -"@reduxjs/toolkit@^1.5.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.6.0.tgz#0a17c6941c57341f8b31e982352b495ab69d5add" - integrity sha512-eGL50G+Vj5AG5uD0lineb6rRtbs96M8+hxbcwkHpZ8LQcmt0Bm33WyBSnj5AweLkjQ7ZP+KFRDHiLMznljRQ3A== - dependencies: - immer "^9.0.1" - redux "^4.1.0" - redux-thunk "^2.3.0" - reselect "^4.0.0" - -"@resolver-engine/core@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" - integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== - dependencies: - debug "^3.1.0" - is-url "^1.2.4" - request "^2.85.0" - -"@resolver-engine/fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" - integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" - integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== - dependencies: - "@resolver-engine/fs" "^0.3.3" - "@resolver-engine/imports" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" - integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - hosted-git-info "^2.6.0" - path-browserify "^1.0.0" - url "^0.11.0" - -"@rollup/plugin-babel@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz#9cb1c5146ddd6a4968ad96f209c50c62f92f9879" - integrity sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" - -"@rollup/plugin-commonjs@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz#3246872dcbcb18a54aaa6277a8c7d7f1b155b745" - integrity sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-json@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" - integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== - dependencies: - "@rollup/pluginutils" "^3.0.8" - -"@rollup/plugin-node-resolve@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" - integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== - dependencies: - "@rollup/pluginutils" "^3.0.8" - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.14.2" - -"@rollup/plugin-replace@^2.3.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": - 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" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@shapeshiftoss/hdwallet-core@1.15.4", "@shapeshiftoss/hdwallet-core@^1.15.2": - version "1.15.4" - resolved "https://registry.yarnpkg.com/@shapeshiftoss/hdwallet-core/-/hdwallet-core-1.15.4.tgz#a5b83591044feb5cd890c105cfc8d02773819658" - integrity sha512-+7TaS9dYzmi840BLsMtkBPAbRe00YYF+mNg3OZ8cZy8wyvtfrZtlMvucEkF5/nWQ0RBsPwTFIwqUUVwviVg7Yg== - dependencies: - eventemitter2 "^5.0.1" - lodash "^4.17.21" - rxjs "^6.4.0" - -"@shapeshiftoss/hdwallet-keepkey-webusb@^1.15.2": - version "1.15.4" - resolved "https://registry.yarnpkg.com/@shapeshiftoss/hdwallet-keepkey-webusb/-/hdwallet-keepkey-webusb-1.15.4.tgz#ab4b0014bceb7d99fc046922119ad7a0193d9a99" - integrity sha512-Zt4KHsZozIcbWvSVmSBxBLQtJ2T3gIgHYRfUPXT4JHYWfCHYY/wzteUIpcGBJivXENqiqtYHqjNJKy/pMFPrGg== - dependencies: - "@shapeshiftoss/hdwallet-core" "1.15.4" - "@shapeshiftoss/hdwallet-keepkey" "1.15.4" - -"@shapeshiftoss/hdwallet-keepkey@1.15.4", "@shapeshiftoss/hdwallet-keepkey@^1.15.2": - version "1.15.4" - resolved "https://registry.yarnpkg.com/@shapeshiftoss/hdwallet-keepkey/-/hdwallet-keepkey-1.15.4.tgz#f924ccd3b38affc4be4d8f126f0765ff6e58b28b" - integrity sha512-TDFkRcxoboioSPsKrQ5hV9Qch/mQy4q+hyUMAzl5ma4U6E6tNadrWHvThkNAuaWsVukeNFstsQa+7JMBg4EqgA== - dependencies: - "@keepkey/device-protocol" "^7.2.1" - "@shapeshiftoss/hdwallet-core" "1.15.4" - bignumber.js "^9.0.1" - bnb-javascript-sdk-nobroadcast "^2.16.14" - crypto-js "^4.0.0" - eip55 "^2.1.0" - ethereumjs-tx "^1.3.7" - google-protobuf "^3.15.8" - lodash "^4.17.21" - semver "^6.3.0" - tiny-secp256k1 "^1.1.6" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@solidity-parser/parser@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" - integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== - -"@solidity-parser/parser@^0.12.0": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.12.2.tgz#1afad367cb29a2ed8cdd4a3a62701c2821fb578f" - integrity sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q== - -"@surma/rollup-plugin-off-main-thread@^1.1.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" - integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== - dependencies: - ejs "^2.6.1" - magic-string "^0.25.0" - -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== - -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== - -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== - -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== - -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== - -"@svgr/babel-plugin-transform-svg-component@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" - integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== - -"@svgr/babel-preset@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" - integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.5.0" - -"@svgr/core@^5.4.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" - integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== - dependencies: - "@svgr/plugin-jsx" "^5.5.0" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" - -"@svgr/hast-util-to-babel-ast@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" - integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== - dependencies: - "@babel/types" "^7.12.6" - -"@svgr/plugin-jsx@^5.4.0", "@svgr/plugin-jsx@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" - integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== - dependencies: - "@babel/core" "^7.12.3" - "@svgr/babel-preset" "^5.5.0" - "@svgr/hast-util-to-babel-ast" "^5.5.0" - svg-parser "^2.0.2" - -"@svgr/plugin-svgo@^5.4.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" - integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== - dependencies: - cosmiconfig "^7.0.0" - deepmerge "^4.2.2" - svgo "^1.2.2" - -"@svgr/webpack@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.4.0.tgz#b68bc86e29cf007292b96ced65f80971175632e0" - integrity sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg== - dependencies: - "@babel/core" "^7.9.0" - "@babel/plugin-transform-react-constant-elements" "^7.9.0" - "@babel/preset-env" "^7.9.5" - "@babel/preset-react" "^7.9.4" - "@svgr/core" "^5.4.0" - "@svgr/plugin-jsx" "^5.4.0" - "@svgr/plugin-svgo" "^5.4.0" - loader-utils "^2.0.0" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@testing-library/dom@^7.28.1": - version "7.31.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" - integrity sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^4.2.2" - chalk "^4.1.0" - dom-accessibility-api "^0.5.6" - lz-string "^1.4.4" - pretty-format "^26.6.2" - -"@testing-library/jest-dom@^5.11.4": - version "5.14.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" - integrity sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ== - dependencies: - "@babel/runtime" "^7.9.2" - "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^4.2.2" - chalk "^3.0.0" - css "^3.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" - lodash "^4.17.15" - redent "^3.0.0" - -"@testing-library/react@^11.1.0": - version "11.2.7" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" - integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^7.28.1" - -"@testing-library/user-event@^12.1.10": - version "12.8.3" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" - integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== - dependencies: - "@babel/runtime" "^7.12.5" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@toruslabs/eccrypto@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.7.tgz#962954d6416f56ca2ba9bb9948cd08bd3b8cd0c4" - integrity sha512-zU4GnrH21yDY179fgp5Ovi4YjLdHy3WXM3QHCHAomYNxa03eAw2lxNR2bZ7kb698yk40s4WMrbnauukgabXH4Q== - dependencies: - acorn "^8.4.1" - elliptic "^6.5.4" - es6-promise "^4.2.8" - nan "^2.14.2" - optionalDependencies: - secp256k1 "^3.8.0" - -"@toruslabs/fetch-node-details@^2.7.0": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@toruslabs/fetch-node-details/-/fetch-node-details-2.7.1.tgz#d234ac8cb232c51f1cc120f3370159ce9bc3d4d2" - integrity sha512-6TfTmApe2OoUyST5s1arTH0dGuh6ONvykuEBjT25nO64Qgwu7eJNVMnH+DDH5Kl9PyboEa74ofGqv54l7oHsuA== - dependencies: - web3-eth-contract "^1.5.2" - web3-utils "^1.5.2" - -"@toruslabs/http-helpers@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-1.4.0.tgz#6d2d4129d1126876b0616b7dffec3f4b339739b5" - integrity sha512-lPRhTWeChQunds2CGV70xvaoFMMebZAqZLpTYZjUJfziumQjT12w9HWLIzlRfGFVKoYUsUiZLpGHl0JEwHCcqg== - dependencies: - deepmerge "^4.2.2" - -"@toruslabs/torus-embed@^1.10.11": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.12.2.tgz#36081ea1547f4f7ffe411cb134a6c21b18c6616c" - integrity sha512-KmLCCX/WziXgrwHcQUMLVwku3V0ymjMRUicEN0Bv5dQY1hj7RnDEHpI7tizWs4iZfFJwhQXLMuRRf7L/O04U/w== - dependencies: - "@chaitanyapotti/random-id" "^1.0.3" - "@metamask/obs-store" "^7.0.0" - "@metamask/post-message-stream" "^4.0.0" - "@metamask/safe-event-emitter" "^2.0.0" - "@toruslabs/fetch-node-details" "^2.7.0" - "@toruslabs/http-helpers" "^1.4.0" - "@toruslabs/torus.js" "^2.4.3" - create-hash "^1.2.0" - deepmerge "^4.2.2" - end-of-stream "^1.4.4" - eth-rpc-errors "^4.0.3" - fast-deep-equal "^3.1.3" - is-stream "^2.0.0" - json-rpc-engine "^6.1.0" - json-rpc-middleware-stream "^3.0.0" - loglevel "^1.7.1" - once "^1.4.0" - pump "^3.0.0" - readable-stream "^3.6.0" - -"@toruslabs/torus.js@^2.4.3": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-2.4.4.tgz#937cbf158c786a4ce3f273d4df55168bc47198a0" - integrity sha512-3bRzGUzQMR2qfpG3om6A9oUma6u9i/Cxi4M3pTea2X0yedOvyO9FPz8IWRbEihJawmZgF2NKmDLPDICm87vLqg== - dependencies: - "@toruslabs/eccrypto" "^1.1.7" - "@toruslabs/http-helpers" "^1.4.0" - bn.js "^5.2.0" - elliptic "^6.5.4" - json-stable-stringify "^1.0.1" - loglevel "^1.7.1" - memory-cache "^0.2.0" - web3-utils "^1.5.2" - -"@truffle/blockchain-utils@^0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.31.tgz#0503d9fb2ce3e05c167c27294927f2f88d70a24d" - integrity sha512-BFo/nyxwhoHqPrqBQA1EAmSxeNnspGLiOCMa9pAL7WYSjyNBlrHaqCMO/F2O87G+NUK/u06E70DiSP2BFP0ZZw== - -"@truffle/codec@^0.11.4": - version "0.11.4" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.11.4.tgz#dfda0de0e8d0396082f5be85def426bfb3decc88" - integrity sha512-NK/ah1aWQFhYYv8kVL382wB+JgSOnWWDdoeGOOMnA3iviRnV7k0JJV+C6uTmaLKOTNGTBNp4hlISLFeKKNnbXA== - dependencies: - big.js "^5.2.2" - bn.js "^5.1.3" - cbor "^5.1.0" - debug "^4.3.1" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.partition "^4.6.0" - lodash.sum "^4.0.2" - semver "^7.3.4" - utf8 "^3.0.0" - web3-utils "1.4.0" - -"@truffle/contract-schema@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.1.tgz#13b404383d438b48960862022a20102970323666" - integrity sha512-2gvu6gxJtbbI67H2Bwh2rBuej+1uCV3z4zKFzQZP00hjNoL+QfybrmBcOVB88PflBeEB+oUXuwQfDoKX3TXlnQ== - dependencies: - ajv "^6.10.0" - crypto-js "^3.1.9-1" - debug "^4.3.1" - -"@truffle/contract@^4.3.8": - version "4.3.24" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.3.24.tgz#5a5f9a5b2498d5374540b735471d5ecd08d38d9a" - integrity sha512-cKijyDzJLRu96KWb/g7soHJkBXgY1HkmCeVhUun9iUJpA93w7StInCP+SPs0gd8Oj7GfcoYcCcnA38l/zJBEsQ== - dependencies: - "@ensdomains/ensjs" "^2.0.1" - "@truffle/blockchain-utils" "^0.0.31" - "@truffle/contract-schema" "^3.4.1" - "@truffle/debug-utils" "^5.1.4" - "@truffle/error" "^0.0.14" - "@truffle/interface-adapter" "^0.5.2" - bignumber.js "^7.2.1" - ethers "^4.0.32" - web3 "1.4.0" - web3-core-helpers "1.4.0" - web3-core-promievent "1.4.0" - web3-eth-abi "1.4.0" - web3-utils "1.4.0" - -"@truffle/debug-utils@^5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-5.1.4.tgz#ccc96e23a05b64fa8a8cfdafb9c03cccef45340b" - integrity sha512-0LdtJzhOuAgEIP4xj3QsB7CKIzoAgRERKx5hYktId9pfm//9leo3luwN0aY8f919rWJynmnaXvE0lQZD3Pcu0Q== - dependencies: - "@truffle/codec" "^0.11.4" - "@trufflesuite/chromafi" "^2.2.2" - bn.js "^5.1.3" - chalk "^2.4.2" - debug "^4.3.1" - highlight.js "^10.4.0" - highlightjs-solidity "^1.1.1" - -"@truffle/error@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" - integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== - -"@truffle/interface-adapter@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.2.tgz#0140fac0b740ad2809b6fe28d856d0f820524658" - integrity sha512-wZert/wvHMg70SWWJODtD+YXATP56xL//Gw5egMrDrE8cfXMmlYmacroLFWSzh1JHlDEh+dev35kUp9ORx0now== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.4.0" - -"@trufflesuite/chromafi@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-2.2.2.tgz#d3fc507aa8504faffc50fb892cedcfe98ff57f77" - integrity sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA== - dependencies: - ansi-mark "^1.0.0" - ansi-regex "^3.0.0" - array-uniq "^1.0.3" - camelcase "^4.1.0" - chalk "^2.3.2" - cheerio "^1.0.0-rc.2" - detect-indent "^5.0.0" - he "^1.1.1" - highlight.js "^10.4.1" - lodash.merge "^4.6.2" - min-indent "^1.0.0" - strip-ansi "^4.0.0" - strip-indent "^2.0.0" - super-split "^1.1.0" - -"@typechain/ethers-v5@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810" - integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== - dependencies: - ethers "^5.0.2" - -"@types/abstract-leveldown@*": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" - integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ== - -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.15" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" - integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== - 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.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/chai@*": - version "4.2.21" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650" - integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg== - -"@types/concat-stream@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" - integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== - dependencies: - "@types/node" "*" - -"@types/connect@^3.4.33": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/d3-path@^2": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.1.tgz#ca03dfa8b94d8add97ad0cd97e96e2006b4763cb" - integrity sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw== - -"@types/d3-scale@^3.0.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" - integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== - dependencies: - "@types/d3-time" "^2" - -"@types/d3-shape@^2.0.0": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" - integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== - dependencies: - "@types/d3-path" "^2" - -"@types/d3-time@^2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" - integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== - -"@types/eslint@^7.2.6": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" - integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@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/express-serve-static-core@^4.17.9": - version "4.17.24" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" - integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/form-data@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - 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@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@*", "@types/jest@^26.0.15": - version "26.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" - integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== - dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" - integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== - -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - -"@types/lodash@^4.14.159": - version "4.14.173" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.173.tgz#9d3b674c67a26cf673756f6aca7b429f237f91ed" - integrity sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg== - -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/minimatch@*", "@types/minimatch@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/node-fetch@^2.5.5": - version "2.5.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.11.tgz#ce22a2e65fc8999f4dbdb7ddbbcf187d755169e4" - integrity sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "16.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.2.tgz#655432817f83b51ac869c2d51dd8305fb8342e16" - integrity sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw== - -"@types/node@10.12.18": - version "10.12.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" - integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== - -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - -"@types/node@^10.0.3": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/node@^12.0.0", "@types/node@^12.12.6": - version "12.20.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.16.tgz#1acf34f6456208f495dac0434dd540488d17f991" - integrity sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA== - -"@types/node@^12.12.54": - version "12.20.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" - integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== - -"@types/node@^8.0.0": - version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@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/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.0.0", "@types/prettier@^2.1.1": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" - integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== - -"@types/qrcode.react@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/qrcode.react/-/qrcode.react-1.0.2.tgz#f892432cc41b5dac52e3ca8873b717c8bfea6002" - integrity sha512-I9Oq5Cjlkgy3Tw7krCnCXLw2/zMhizkTere49OOcta23tkvH0xBTP0yInimTh0gstLRtb8Ki9NZVujE5UI6ffQ== - dependencies: - "@types/react" "*" - -"@types/qs@*", "@types/qs@^6.2.31": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-dom@^17", "@types/react-dom@^17.0.1", "@types/react-dom@^17.0.9": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" - integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== - dependencies: - "@types/react" "*" - -"@types/react-modal@^3.12.0": - version "3.12.1" - resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.12.1.tgz#fd1558762ed96020291b831190c85bc721aad3c1" - integrity sha512-pgq/jAnSJqHX7NXTFyUSXwlFOBUGngBXavFmAIKE7bkM7WNKyF/9XvmMr2+eIBOvR8waiA0Nj2qHfDZqMgeT6w== - dependencies: - "@types/react" "*" - -"@types/react-qr-reader@^2.1.3": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@types/react-qr-reader/-/react-qr-reader-2.1.4.tgz#a36f0b83b4402e26c4217d0e8af6b5e2887fc749" - integrity sha512-2Hq+UNfsO2TVqxbFlOE0gGhQr/+C4wdgNDaaLV8K93mK/Z7Vw2D3YbMlnJAaSzM45fUtYJs0vc48wV04+OEkiA== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.16": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.18.tgz#2bf8fd56ebaae679a90ebffe48ff73717c438e04" - integrity sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-router-dom@^5.1.7": - version "5.1.8" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.8.tgz#bf3e1c8149b3d62eaa206d58599de82df0241192" - integrity sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw== - dependencies: - "@types/history" "*" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.16" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" - integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react@*", "@types/react@^17", "@types/react@^17.0.0": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.14.tgz#f0629761ca02945c4e8fea99b8177f4c5c61fb0f" - integrity sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/resize-observer-browser@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz#d8e6c2f830e2650dc06fe74464472ff64b54a302" - integrity sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg== - -"@types/resolve@0.0.8", "@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/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/sha.js@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/sha.js/-/sha.js-2.4.0.tgz#bce682ef860b40f419d024fa08600c3b8d24bb01" - integrity sha512-amxKgPy6WJTKuw8mpUwjX2BSxuBtBmZfRwIUDIuPJKNwGN8CWDli8JTg5ONTWOtcTkHIstvT7oAhhYXqEjStHQ== - dependencies: - "@types/node" "*" - -"@types/sinon-chai@^3.2.3": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" - integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4" - integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw== - dependencies: - "@sinonjs/fake-timers" "^7.1.0" - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== - -"@types/testing-library__jest-dom@^5.9.1": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz#98eb7537cb5502bcca7a0d82acf5f245a2e6c322" - integrity sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A== - dependencies: - "@types/jest" "*" - -"@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== - dependencies: - source-map "^0.6.1" - -"@types/underscore@*": - version "1.11.3" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.3.tgz#d6734f3741ce41b2630018c6b61c6745f6188c07" - integrity sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw== - -"@types/web3@1.0.19": - version "1.0.19" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" - integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== - dependencies: - "@types/bn.js" "*" - "@types/underscore" "*" - -"@types/webpack-sources@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.1.tgz#6af17e3a3ded71eec2b98008d7c12f498a0a4506" - integrity sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" - -"@types/webpack@^4.41.8": - version "4.41.30" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc" - integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA== - dependencies: - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^4.5.0": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.3.tgz#36cdcd9ca6f9e5cb49b9f61b970b1976708d084b" - integrity sha512-jW8sEFu1ZeaV8xzwsfi6Vgtty2jf7/lJmQmDkDruBjYAbx5DA8JtbcMnP0rNPUG+oH5GoQBTSp+9613BzuIpYg== - dependencies: - "@typescript-eslint/experimental-utils" "4.28.3" - "@typescript-eslint/scope-manager" "4.28.3" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.28.3", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.3.tgz#976f8c1191b37105fd06658ed57ddfee4be361ca" - integrity sha512-zZYl9TnrxwEPi3FbyeX0ZnE8Hp7j3OCR+ELoUfbwGHGxWnHg9+OqSmkw2MoCVpZksPCZYpQzC559Ee9pJNHTQw== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.3" - "@typescript-eslint/types" "4.28.3" - "@typescript-eslint/typescript-estree" "4.28.3" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/experimental-utils@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^4.5.0": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.3.tgz#95f1d475c08268edffdcb2779993c488b6434b44" - integrity sha512-ZyWEn34bJexn/JNYvLQab0Mo5e+qqQNhknxmc8azgNd4XqspVYR5oHq9O11fLwdZMRcj4by15ghSlIEq+H5ltQ== - dependencies: - "@typescript-eslint/scope-manager" "4.28.3" - "@typescript-eslint/types" "4.28.3" - "@typescript-eslint/typescript-estree" "4.28.3" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.28.3": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz#c32ad4491b3726db1ba34030b59ea922c214e371" - integrity sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ== - dependencies: - "@typescript-eslint/types" "4.28.3" - "@typescript-eslint/visitor-keys" "4.28.3" - -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== - -"@typescript-eslint/types@4.28.3": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.3.tgz#8fffd436a3bada422c2c1da56060a0566a9506c7" - integrity sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA== - -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== - dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@4.28.3": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz#253d7088100b2a38aefe3c8dd7bd1f8232ec46fb" - integrity sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w== - dependencies: - "@typescript-eslint/types" "4.28.3" - "@typescript-eslint/visitor-keys" "4.28.3" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== - dependencies: - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/visitor-keys@4.28.3": - version "4.28.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz#26ac91e84b23529968361045829da80a4e5251c4" - integrity sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg== - dependencies: - "@typescript-eslint/types" "4.28.3" - eslint-visitor-keys "^2.0.0" - -"@uniswap/sdk@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@uniswap/sdk/-/sdk-3.0.3.tgz#8201c7c72215d0030cb99acc7e661eff895c18a9" - integrity sha512-t4s8bvzaCFSiqD2qfXIm3rWhbdnXp+QjD3/mRaeVDHK7zWevs6RGEb1ohMiNgOCTZANvBayb4j8p+XFdnMBadQ== - dependencies: - "@uniswap/v2-core" "^1.0.0" - big.js "^5.2.2" - decimal.js-light "^2.5.0" - jsbi "^3.1.1" - tiny-invariant "^1.1.0" - tiny-warning "^1.0.3" - toformat "^2.0.0" - -"@uniswap/v2-core@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" - integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== - -"@walletconnect/browser-utils@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.5.4.tgz#7f23d3bca0d1e9b64f59b3847f9fc83434547253" - integrity sha512-09yRcfQRQiDpwf6JY57UQOzFfSOunszcSFDFekV+hz8VdShdKmq02w0hp5c4i9T0dAX+eCHNUtOun+jN6CPIDw== - dependencies: - "@walletconnect/safe-json" "1.0.0" - "@walletconnect/types" "^1.5.4" - "@walletconnect/window-getters" "1.0.0" - "@walletconnect/window-metadata" "1.0.0" - detect-browser "5.2.0" - -"@walletconnect/browser-utils@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.6.5.tgz#01180682e90b95384e820191a1c6ad4a78729439" - integrity sha512-HLTysmlCkc2HN2OS6ewMG0v8E9oY2h9zNaDHe0BLN3ZxnsoMCVzkJxy7ryaXCemVdapmr6HgHFexGJoMbWaC4w== - dependencies: - "@walletconnect/safe-json" "1.0.0" - "@walletconnect/types" "^1.6.5" - "@walletconnect/window-getters" "1.0.0" - "@walletconnect/window-metadata" "1.0.0" - detect-browser "5.2.0" - -"@walletconnect/client@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.5.4.tgz#ee5db6876d83272ab8d6cdf61bd409aa10e40212" - integrity sha512-NGslp4HfSBC/pf6QNpH49RQKW0IznqzR4Ooarr23yEcyO8XzOZDfra+Y7mKQkarXAN2O1HHBY3h3VF/C0mlwCw== - dependencies: - "@walletconnect/core" "^1.5.4" - "@walletconnect/iso-crypto" "^1.5.4" - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - -"@walletconnect/client@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.6.5.tgz#6616ae926abc7c87c48a2d3693f2eb697858e685" - integrity sha512-dRq1D3NEGwM2I3CpiwFsWy1rrdMKCMSfDUu3rCCXUE4zInx+pyq7IEFjYiSjtOEZzjRlUTqYwhjnYIezQZgh4w== - dependencies: - "@walletconnect/core" "^1.6.5" - "@walletconnect/iso-crypto" "^1.6.5" - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - -"@walletconnect/core@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.5.4.tgz#bde2e95583f1a6112d03f27d6709a124e8efca35" - integrity sha512-jJWKA4fnrjcWaOK/d4ct130Ic8Ycf0ZSgaNMm/9Uh+t6CAFJmY2M3WTUf3UagGZ3+7vAGJwMYVR7NN4k86mfqg== - dependencies: - "@walletconnect/socket-transport" "^1.5.4" - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - -"@walletconnect/core@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.6.5.tgz#acb687fc7c2d71ce2adad6a921ec1b343c4b4dd7" - integrity sha512-mmMTP8nZunjSCAy0ckafvt/JcdzcuSZPaAybqgKwx2rC9cc/3XWrdNsfiKMt8AFoQF87jGHem3905eFZYTqLXw== - dependencies: - "@walletconnect/socket-transport" "^1.6.5" - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - -"@walletconnect/crypto@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.1.tgz#d4c1b1cd5dd1be88fe9a82dfc54cadbbb3f9d325" - integrity sha512-IgUReNrycIFxkGgq8YT9HsosCkhutakWD9Q411PR0aJfxpEa/VKJeaLRtoz6DvJpztWStwhIHnAbBoOVR72a6g== - dependencies: - "@walletconnect/encoding" "^1.0.0" - "@walletconnect/environment" "^1.0.0" - "@walletconnect/randombytes" "^1.0.1" - aes-js "^3.1.2" - hash.js "^1.1.7" - -"@walletconnect/encoding@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.0.tgz#e24190cb5e803526f9dfd7191fb0e4dc53c6d864" - integrity sha512-4nkJFnS0QF5JdieG/3VPD1/iEWkLSZ14EBInLZ00RWxmC6EMZrzAeHNAWIgm+xP3NK0lqz+7lEsmWGtcl5gYnQ== - dependencies: - is-typedarray "1.0.0" - typedarray-to-buffer "3.1.5" - -"@walletconnect/environment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" - integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== - -"@walletconnect/http-connection@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.5.4.tgz#9671ef1aa165b71e5ff2b13e8b6f356a261b7b02" - integrity sha512-xiCiQzw4W4nuTQNqDuM/4Dwtf3/wX5CsGbR56RmUUgbxs4WRN7w4W3pXyogOX77zGGk3AUHxWEawppYNIq7sgQ== - dependencies: - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - eventemitter3 "4.0.7" - xhr2-cookies "1.1.0" - -"@walletconnect/http-connection@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.6.5.tgz#18529b7556bc09d7c794f4adc76ef0742cd500aa" - integrity sha512-5kr6wZ3DnqaBiwkeA9iKdawvIb3bIJNf8WA8X89YHE5KOzbkAsymjniZWs8asdl9Y9+8ZHJMPXtylyrkpT8wXA== - dependencies: - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - eventemitter3 "4.0.7" - xhr2-cookies "1.1.0" - -"@walletconnect/iso-crypto@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.5.4.tgz#59c4bbf7337cf1868cb204b14c7dccee4b37c307" - integrity sha512-mwYyuPzWEvjkVi5DkgAu6aTjf2KMPmlXaIrqBPvGVeuhFrlxf3pYOjunBoxHm/Lnm9a9FQPwkGf6s9DQEl2r1A== - dependencies: - "@walletconnect/crypto" "^1.0.1" - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - -"@walletconnect/iso-crypto@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.6.5.tgz#1c6471506283817e7e797c5e2e733f6c3d88f8dc" - integrity sha512-145VRX1+gudhHrnT2s81lLW/BEu3QgFMMRCrkxx9Tsl5JiLGcGbWkMxAl8zjGTMqnHeuQngyjvY1mO+3z27a7A== - dependencies: - "@walletconnect/crypto" "^1.0.1" - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - -"@walletconnect/jsonrpc-types@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz#fa75ad5e8f106a2e33287b1e6833e22ed0225055" - integrity sha512-11QXNq5H1PKZk7bP8SxgmCw3HRaDuPOVE+wObqEvmhc7OWYUZqfuaaMb+OXGRSOHL3sbC+XHfdeCxFTMXSFyng== - dependencies: - keyvaluestorage-interface "^1.0.0" - -"@walletconnect/jsonrpc-utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz#1a2f668d606e8f0b6e7d8fdebae86001bd037a3f" - integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== - dependencies: - "@walletconnect/environment" "^1.0.0" - "@walletconnect/jsonrpc-types" "^1.0.0" - -"@walletconnect/mobile-registry@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" - integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== - -"@walletconnect/qrcode-modal@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.5.4.tgz#a6efdb19dac6f7fe53e1a778ffb7de0838f29dd5" - integrity sha512-8i/2ruMSHsWvkg7xOgSJSty/iMPiZ5MFdC8XxqxebdvYUDPB5/nyDihQFExpqBxeKk2QAOqtav3/38HbBinoLA== - dependencies: - "@walletconnect/browser-utils" "^1.5.4" - "@walletconnect/mobile-registry" "^1.4.0" - "@walletconnect/types" "^1.5.4" - copy-to-clipboard "^3.3.1" - preact "10.4.1" - qrcode "1.4.4" - -"@walletconnect/qrcode-modal@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.6.5.tgz#58974ca8f826bd500121e85694dd342b3535cf2c" - integrity sha512-XII/Pm7zS5pRxrakURuhbWO+SfwgOuLuvOBk/hr1ATK/y7R5p19P62mCSUrvSxHXca27IX1tZJRe9D161R0WgQ== - dependencies: - "@walletconnect/browser-utils" "^1.6.5" - "@walletconnect/mobile-registry" "^1.4.0" - "@walletconnect/types" "^1.6.5" - copy-to-clipboard "^3.3.1" - preact "10.4.1" - qrcode "1.4.4" - -"@walletconnect/randombytes@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.1.tgz#87f0f02d9206704ce1c9e23f07d3b28898c48385" - integrity sha512-YJTyq69i0PtxVg7osEpKfvjTaWuAsR49QEcqGKZRKVQWMbGXBZ65fovemK/SRgtiFRv0V8PwsrlKSheqzfPNcg== - dependencies: - "@walletconnect/encoding" "^1.0.0" - "@walletconnect/environment" "^1.0.0" - randombytes "^2.1.0" - -"@walletconnect/safe-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" - integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== - -"@walletconnect/socket-transport@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.5.4.tgz#ac52fa1940036950418c9f2e702e861a9993afaf" - integrity sha512-9xPpN2QvRc8i65wIaDEiFLPWdgKY/S+0ba5zSTqKAyjQVWPBH+/wr4xcoOF1lLdMKanFiyEpH1z25+6ndp7cAw== - dependencies: - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - ws "7.3.0" - -"@walletconnect/socket-transport@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.6.5.tgz#f190f2d994021287fdeaf071114a5415096b2535" - integrity sha512-FRlgBr3EIxD3du5l/tuK6jdiva85YeRG+iZmo/RPnlVw4opy74WXb5JdCK9jXLcBEoDiY9Hz4j69aqnht6gIDQ== - dependencies: - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - ws "7.5.3" - -"@walletconnect/types@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.5.4.tgz#2dc6240b8779c0e5ad5b086a32c9d59bb8d488ed" - integrity sha512-K3XQA5y2dfVfLObjrj4YPVcqxw3qZVpUan/UvsuC0e06vP+Gk6J6u2Xs196Or9/gLDSu05S/R69SukuWEtaHNA== - -"@walletconnect/types@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.6.5.tgz#31ad1415fc6e1e89e25a10ad5fed6958f56cefa8" - integrity sha512-S9DsODI35PbIDuOSkIiF8SzTstqCqX/4+kV7n18vyukEFPlpSSHwZMwJUfzo9yJ0pqsqLNZta+jvb88gJRuAaA== - -"@walletconnect/utils@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.5.4.tgz#9fdf57169bca8006625e53e8acdb08346fa4746b" - integrity sha512-M/Wbm+kuaAo4dmfNY3UHsXnLpW0XpnoMChKlmPO56SqN0xK0GEUn4UGWxKTsR9WuhMcqajbjOnsI5m9PzIfMoQ== - dependencies: - "@walletconnect/browser-utils" "^1.5.4" - "@walletconnect/encoding" "^1.0.0" - "@walletconnect/jsonrpc-utils" "^1.0.0" - "@walletconnect/types" "^1.5.4" - bn.js "4.11.8" - js-sha3 "0.8.0" - query-string "6.13.5" - -"@walletconnect/utils@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.6.5.tgz#6edd749cb52a363feda117121dc865d7cc6169f7" - integrity sha512-QB5rn/1s0PKVitAQ2/mgWbay2XfN21y3ob+5g6IhxtJRW31bbMoZw5YfO6s4ixLaZZez5LNQXstvQAclRzB7jQ== - dependencies: - "@walletconnect/browser-utils" "^1.6.5" - "@walletconnect/encoding" "^1.0.0" - "@walletconnect/jsonrpc-utils" "^1.0.0" - "@walletconnect/types" "^1.6.5" - bn.js "4.11.8" - js-sha3 "0.8.0" - query-string "6.13.5" - -"@walletconnect/web3-provider@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.5.4.tgz#f99bea54b237e884fa7d06fc822e0140300f0059" - integrity sha512-ArHHo5fscwG75YTlmvks+8GGgyDqA/mvFab1D/7EZzPPh/guJB6bjpn5db59g6eudyi+VybTRcNGnPSJVZGJvQ== - dependencies: - "@walletconnect/client" "^1.5.4" - "@walletconnect/http-connection" "^1.5.4" - "@walletconnect/qrcode-modal" "^1.5.4" - "@walletconnect/types" "^1.5.4" - "@walletconnect/utils" "^1.5.4" - web3-provider-engine "16.0.1" - -"@walletconnect/web3-provider@^1.6.2": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.6.5.tgz#7c4ac2f89ddda1a4069d500ed29cc4396e7fdade" - integrity sha512-SeC7+1saHxvFn2wjt/3F0sTkDemHDNDbMkdZ3jtA7vjEw91Q0CmaYIuZk2UxyVM+tC1jL1l4yci/sgaFeAcXpQ== - dependencies: - "@walletconnect/client" "^1.6.5" - "@walletconnect/http-connection" "^1.6.5" - "@walletconnect/qrcode-modal" "^1.6.5" - "@walletconnect/types" "^1.6.5" - "@walletconnect/utils" "^1.6.5" - web3-provider-engine "16.0.1" - -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" - integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== - -"@walletconnect/window-metadata@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" - integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== - dependencies: - "@walletconnect/window-getters" "^1.0.0" - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -JSONStream@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" - integrity sha1-wQI3G27Dp887hHygDCC7D85Mbeo= - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abstract-leveldown@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" - integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" - integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= - dependencies: - acorn "^4.0.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - -acorn@^5.0.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== - -address@1.1.2, address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -adjust-sourcemap-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" - integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= - -aes-js@^3.1.1, aes-js@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.1: - version "8.6.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295" - integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@^3.0.0, ansi-colors@^3.2.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -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@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html@0.0.7, ansi-html@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-mark@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ansi-mark/-/ansi-mark-1.0.4.tgz#1cd4ba8d57f15f109d6aaf6ec9ca9786c8a4ee6c" - integrity sha1-HNS6jVfxXxCdaq9uycqXhsik7mw= - dependencies: - ansi-regex "^3.0.0" - array-uniq "^1.0.3" - chalk "^2.3.2" - strip-ansi "^4.0.0" - super-split "^1.1.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.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.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antd@^4.16.7: - version "4.16.7" - resolved "https://registry.yarnpkg.com/antd/-/antd-4.16.7.tgz#c51fb143288adb8b008a786efe8d5df13320ac4c" - integrity sha512-9XQnTpQ21zqnXWAvFvt1mm0j5+r4E7N/eK0kSEBqxuoTCzTrrn5iwhXFEZ2htJx9QJFlihST/T1Wd8JzRf9J3Q== - dependencies: - "@ant-design/colors" "^6.0.0" - "@ant-design/icons" "^4.6.2" - "@ant-design/react-slick" "~0.28.1" - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.2.6" - copy-to-clipboard "^3.2.0" - lodash "^4.17.21" - moment "^2.25.3" - rc-cascader "~1.4.0" - rc-checkbox "~2.3.0" - rc-collapse "~3.1.0" - rc-dialog "~8.5.1" - rc-drawer "~4.3.0" - rc-dropdown "~3.2.0" - rc-field-form "~1.20.0" - rc-image "~5.2.4" - rc-input-number "~7.1.0" - rc-mentions "~1.6.1" - rc-menu "~9.0.12" - rc-motion "^2.4.0" - rc-notification "~4.5.7" - rc-pagination "~3.1.6" - rc-picker "~2.5.10" - rc-progress "~3.1.0" - rc-rate "~2.9.0" - rc-resize-observer "^1.0.0" - rc-select "~12.1.6" - rc-slider "~9.7.1" - rc-steps "~4.1.0" - rc-switch "~3.2.0" - rc-table "~7.15.1" - rc-tabs "~11.9.1" - rc-textarea "~0.3.0" - rc-tooltip "~5.1.1" - rc-tree "~4.2.1" - rc-tree-select "~4.3.0" - rc-trigger "^5.2.1" - rc-upload "~4.3.0" - rc-util "^5.13.1" - scroll-into-view-if-needed "^2.2.25" - warning "^4.0.3" - -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" - -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -apisauce@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-2.1.1.tgz#0b8bc7f2544e6ef710a6fa1d6f49583856940dd2" - integrity sha512-P4SsLvmsH8BLLruBn/nsO+65j+ChZlGQ2zC5avCIjbWstYS4PgjxeVWtbeVwFGEWX7dEkLp85OvdapGXy1zS8g== - dependencies: - axios "^0.21.1" - ramda "^0.25.0" - -app-module-path@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -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" - -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - -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-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - get-intrinsic "^1.1.1" - is-string "^1.0.5" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1, array-uniq@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -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.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - -array.prototype.flatmap@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" - -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asmcrypto.js@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz#b9f84bd0a1fb82f21f8c29cc284a707ad17bba2e" - integrity sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA== - -asn1.js@^5.0.1, asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -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" - -"assemblyscript@git+https://github.com/AssemblyScript/assemblyscript.git#36040d5b5312f19a025782b5e36663823494c2f3": - version "0.6.0" - resolved "git+https://github.com/AssemblyScript/assemblyscript.git#36040d5b5312f19a025782b5e36663823494c2f3" - dependencies: - "@protobufjs/utf8" "^1.1.0" - binaryen "77.0.0-nightly.20190407" - glob "^7.1.3" - long "^4.0.0" - opencollective-postinstall "^2.0.0" - source-map-support "^0.5.11" - -"assemblyscript@git+https://github.com/AssemblyScript/assemblyscript.git#v0.6": - version "0.6.0" - resolved "git+https://github.com/AssemblyScript/assemblyscript.git#3ed76a97f05335504166fce1653da75f4face28f" - dependencies: - "@protobufjs/utf8" "^1.1.0" - binaryen "77.0.0-nightly.20190407" - glob "^7.1.3" - long "^4.0.0" - opencollective-postinstall "^2.0.0" - source-map-support "^0.5.11" - -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= - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -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-eventemitter@^0.2.2, async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -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== - -async-mutex@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" - integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== - dependencies: - tslib "^2.0.0" - -async-validator@^3.0.3: - version "3.5.2" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" - integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ== - -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - -async@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - -async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1, async@^2.6.2, async@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -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== - -authereum@^0.1.12: - version "0.1.14" - resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.1.14.tgz#5655e543b296d899136e350d09f9cfe4c12fbc38" - integrity sha512-o1lsXXGg+oYDAEutZ8Ak1Qn2Dnk+qSyQ2ZokyLHRSYGJj6HpEHaSlQA6W3VTHD5r68Q+W0JD/BN9hDSF2xyshQ== - dependencies: - async "3.2.0" - bn.js "5.1.2" - ethereum-private-key-to-address "0.0.3" - ethers "4.0.47" - eventemitter3 "4.0.0" - is-buffer "2.0.4" - penpal "4.1.1" - pify "4.0.1" - querystring "0.2.0" - store "2.0.12" - to-hex "0.0.11" - uuidv4 "6.0.6" - web3-provider-engine "15.0.4" - web3-utils "1.2.1" - -autolinker@^3.14.3: - version "3.14.3" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-3.14.3.tgz#c61c424bc6077bcf2fc62803803ec2f58e15a7ec" - integrity sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg== - dependencies: - tslib "^1.9.3" - -autoprefixer@^9.6.1: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" - integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== - -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.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axe-core@^4.0.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.1.tgz#0c6a076e4a1c3e0544ba6a9479158f9be7a7928e" - integrity sha512-3WVgVPs/7OnKU3s+lqMtkv3wQlg3WxK1YifmpJSDO0E1aPBrZWlrrTO6cxRqCXLuX2aYgCljqXIQd0VnRidV0g== - -axios@0.21.1, axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== - dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" - -axobject-query@^2.2.0: - 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-core@^6.0.14, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@^10.1.0: - 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-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== - dependencies: - babylon "^6.18.0" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-jest@^26.6.0, babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-loader@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== - dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" - schema-utils "^2.6.5" - -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-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -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@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@2.8.0: - 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-named-asset-import@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" - integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== - -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" - integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.14.0" - -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-remove-prop-types@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== - dependencies: - babel-plugin-jest-hoist "^26.6.2" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-react-app@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" - integrity sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg== - dependencies: - "@babel/core" "7.12.3" - "@babel/plugin-proposal-class-properties" "7.12.1" - "@babel/plugin-proposal-decorators" "7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" - "@babel/plugin-proposal-numeric-separator" "7.12.1" - "@babel/plugin-proposal-optional-chaining" "7.12.1" - "@babel/plugin-transform-flow-strip-types" "7.12.1" - "@babel/plugin-transform-react-display-name" "7.12.1" - "@babel/plugin-transform-runtime" "7.12.1" - "@babel/preset-env" "7.12.1" - "@babel/preset-react" "7.12.1" - "@babel/preset-typescript" "7.12.1" - "@babel/runtime" "7.12.1" - babel-plugin-macros "2.8.0" - babel-plugin-transform-react-remove-prop-types "0.4.24" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.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-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, 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.19.0, babel-types@^6.24.1, 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" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -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== - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - -backoff@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= - dependencies: - precond "0.2" - -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-x@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" - integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== - dependencies: - safe-buffer "^5.0.1" - -base58check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base58check/-/base58check-2.0.0.tgz#8046652d14bc87f063bd16be94a39134d3b61173" - integrity sha1-gEZlLRS8h/BjvRa+lKORNNO2EXM= - dependencies: - bs58 "^3.0.0" - -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -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" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -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" - -bech32@1.1.4, bech32@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - -bfj@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" - integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== - dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" - hoopy "^0.1.4" - tryer "^1.0.1" - -big-integer@1.6.36: - version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -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== - -bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binaryen@77.0.0-nightly.20190407: - version "77.0.0-nightly.20190407" - resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-77.0.0-nightly.20190407.tgz#fbe4f8ba0d6bd0809a84eb519d2d5b5ddff3a7d1" - integrity sha512-1mxYNvQ0xywMe582K7V6Vo2zzhZZxMTeGHH8aE/+/AND8f64D8Q1GThVY3RVRwGY/4p+p95ccw9Xbw2ovFXRIg== - -bind-decorator@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" - integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= - -bindings@^1.2.1, bindings@^1.3.0, 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" - -bip32@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134" - integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== - dependencies: - "@types/node" "10.12.18" - bs58check "^2.1.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - tiny-secp256k1 "^1.1.3" - typeforce "^1.11.5" - wif "^2.0.6" - -bip39@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" - integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== - dependencies: - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - safe-buffer "^5.0.1" - unorm "^1.3.3" - -bip39@^3.0.2, bip39@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" - integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== - dependencies: - "@types/node" "11.11.6" - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - -bitwise@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bitwise/-/bitwise-2.1.0.tgz#1853fac76500c86da01e3819150a4edf92a7abdb" - integrity sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ== - -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bl@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f" - integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ== - dependencies: - readable-stream "^3.0.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" - integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@4.11.8: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -bn.js@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -bnb-javascript-sdk-nobroadcast@^2.16.14: - version "2.16.15" - resolved "https://registry.yarnpkg.com/bnb-javascript-sdk-nobroadcast/-/bnb-javascript-sdk-nobroadcast-2.16.15.tgz#712723911081fbde48251d59e6074fac5dd24044" - integrity sha512-+vZOmPszzQcNVxx4ZpUJtGs0FEdzAQdbDvBZEHDwU9Epzh6I2xEe+Kehf0T2ombbtJRtzcwlEVYCdcvvv0SPIg== - dependencies: - axios "0.21.1" - bech32 "^1.1.3" - big.js "^5.2.2" - bip32 "^2.0.5" - bip39 "^3.0.2" - bn.js "^4.11.8" - camelcase "^5.3.1" - crypto-browserify "^3.12.0" - crypto-js "^3.1.9-1" - elliptic "^6.0.0" - eslint-utils "^1.4.2" - events "^3.0.0" - is_js "^0.9.0" - lodash "^4.17.19" - minimist "^1.2.5" - ndjson "^1.5.0" - protocol-buffers-encodings "^1.1.0" - pumpify "^2.0.1" - secure-random "^1.1.2" - tiny-secp256k1 "^1.1.3" - url "^0.11.0" - uuid "^3.3.2" - websocket-stream "^5.5.0" - -bnc-notify@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/bnc-notify/-/bnc-notify-1.9.1.tgz#cd8ec8e5f5482cf78b6caea7de35288ee73d6b32" - integrity sha512-OWXI6KIOU/0CWhlFBiIStfbio3X5uUTeBjG6h4R7Ng6MABqZHMFRCNOgVQ50HdwwZiaFMuA3l23cZLxJjyaY0Q== - dependencies: - bignumber.js "^9.0.0" - bnc-sdk "^3.5.0" - lodash.debounce "^4.0.8" - regenerator-runtime "^0.13.3" - uuid "^3.3.3" - -bnc-onboard@^1.34.2: - version "1.34.2" - resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.34.2.tgz#f069e55298dc2c8ba73e3d0783092d6c65f99324" - integrity sha512-SYDX9y76QKWjRlJp+E7wP5bkesO7vnBGulqYm2MixpXVSpd+XMa7FfoYN7G/q33MDa5q/frwoxYrS9d70Lhjow== - dependencies: - "@cvbb/eth-keyring" "^1.1.0" - "@ensdomains/ensjs" "^2.0.1" - "@ethereumjs/common" "^2.0.0" - "@ethereumjs/tx" "^3.0.0" - "@gnosis.pm/safe-apps-provider" "^0.5.0" - "@gnosis.pm/safe-apps-sdk" "^3.0.0" - "@keystonehq/eth-keyring" "0.7.7" - "@ledgerhq/hw-app-eth" "^5.49.0" - "@ledgerhq/hw-transport-u2f" "^5.21.0" - "@ledgerhq/hw-transport-webusb" "5.53.0" - "@myetherwallet/mewconnect-web-client" "^2.2.0-beta.11" - "@portis/web3" "^4.0.0" - "@shapeshiftoss/hdwallet-core" "^1.15.2" - "@shapeshiftoss/hdwallet-keepkey" "^1.15.2" - "@shapeshiftoss/hdwallet-keepkey-webusb" "^1.15.2" - "@toruslabs/torus-embed" "^1.10.11" - "@walletconnect/web3-provider" "^1.6.2" - authereum "^0.1.12" - bignumber.js "^9.0.0" - bnc-sdk "^3.4.1" - bowser "^2.10.0" - eth-lattice-keyring "^0.2.7" - eth-provider "^0.6.1" - eth-sig-util "^3.0.1" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^7.0.3" - fortmatic "^2.2.1" - hdkey "^2.0.1" - regenerator-runtime "^0.13.7" - trezor-connect "^8.1.9" - walletlink "^2.1.9" - web3-provider-engine "^15.0.4" - -bnc-sdk@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/bnc-sdk/-/bnc-sdk-3.4.1.tgz#fca070656a6efbfc489889ed0404e1b6289c17ff" - integrity sha512-GrZzN3zyqVOmtk++tvq/X1zchO+Bt9TIzw39xv7UkMLEUcs43pwj6XWphLRbqkrrILNSrLwOI0S8opyjffDFAA== - dependencies: - crypto-es "^1.2.2" - rxjs "^6.6.3" - sturdy-websocket "^0.1.12" - -bnc-sdk@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bnc-sdk/-/bnc-sdk-3.5.0.tgz#b863a2d947857d87c56d53261bd43529f1a5c03e" - integrity sha512-4CSon8xRTjtD7YOUDJcyqZ/bKCNNwDc4sOPq6O19AlolYTsbbVvh+p5EOmYqL4Re30hI3lKQxN4sh12A6VnAPQ== - dependencies: - crypto-es "^1.2.2" - rxjs "^6.6.3" - sturdy-websocket "^0.1.12" - -body-parser@1.19.0, body-parser@^1.16.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - -bowser@^2.10.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" - integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== - -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" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-or-node@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" - integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== - -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-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.14.2: - version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" - integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== - dependencies: - caniuse-lite "^1.0.30001125" - electron-to-chromium "^1.3.564" - escalade "^3.0.2" - node-releases "^1.1.61" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -bs58@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-3.1.0.tgz#d4c26388bf4804cac714141b1945aa47e5eb248e" - integrity sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4= - dependencies: - base-x "^1.1.0" - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0, buffer-from@^1.1.1: - 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== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - -buffer@6.0.3, buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.0.5, buffer@^5.1.0, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" - integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== - dependencies: - node-gyp-build "^4.2.0" - -builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytebuffer@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" - integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= - dependencies: - long "~3" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" - integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== - dependencies: - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -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" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cachedown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= - dependencies: - abstract-leveldown "^2.4.1" - lru-cache "^3.2.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" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -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@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@5.3.1, 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== - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - -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@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001219: - version "1.0.30001245" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz#45b941bbd833cb0fa53861ff2bae746b3c6ca5d4" - integrity sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA== - -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" - -case-sensitive-paths-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== - -caseless@^0.12.0, caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -cbor-sync@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cbor-sync/-/cbor-sync-1.0.4.tgz#5a11a1ab75c2a14d1af1b237fd84aa8c1593662f" - integrity sha512-GWlXN4wiz0vdWWXBU71Dvc1q3aBo0HytqwAZnXF1wOwjqNnDWA1vZ1gDMFLlqohak31VQzmhiYfiCX5QSSfagA== - -cbor@^5.0.2, cbor@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chai@^4.2.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.2, 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@^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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -check-types@^11.1.1: - version "11.1.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" - integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== - -checkpoint-store@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= - dependencies: - functional-red-black-tree "^1.0.1" - -cheerio-select@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" - integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== - dependencies: - css-select "^4.1.3" - css-what "^5.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - domutils "^2.7.0" - -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" - integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== - dependencies: - cheerio-select "^1.5.0" - dom-serializer "^1.3.2" - domhandler "^4.2.0" - htmlparser2 "^6.1.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - tslib "^2.2.0" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.2, chokidar@^3.4.0, chokidar@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - 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" - -chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -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== - -cids@^0.7.1, cids@~0.7.0, cids@~0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cids@~0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" - integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== - dependencies: - buffer "^5.6.0" - class-is "^1.1.0" - multibase "^1.0.0" - multicodec "^1.0.1" - multihashes "^1.0.1" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - 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" - -classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-css@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -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@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" - integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== - -cli-table3@^0.5.0, cli-table3@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -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" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -clone@2.1.2, clone@^2.0.0, clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -clsx@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -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= - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -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, color-convert@^1.9.1: - 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.0.0, 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== - -color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" - -colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -colors@^1.1.2, colors@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, 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" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -command-line-args@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^2.15.0, commander@^2.20.0, commander@^2.20.3: - 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== - -commander@^4.0.0, commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-tags@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@~1.3.0: - 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== - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" - integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== - -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= - -concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -"concat-stream@github:hugomrdias/concat-stream#feat/smaller": - version "2.0.0" - resolved "https://codeload.github.com/hugomrdias/concat-stream/tar.gz/057bc7b5d6d8df26c8cf00a3f151b6721a0a8034" - dependencies: - inherits "^2.0.3" - readable-stream "^3.0.2" - -confusing-browser-globals@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" - integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -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" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - -convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -cookie@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -cookiejar@^2.1.0, cookiejar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -copy-anything@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" - integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== - dependencies: - is-what "^3.12.0" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -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= - -copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - -core-js-compat@^3.14.0, core-js-compat@^3.15.0, core-js-compat@^3.6.2: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" - integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== - dependencies: - browserslist "^4.16.6" - semver "7.0.0" - -core-js-pure@^3.0.1, core-js-pure@^3.15.0: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" - integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.4.4: - version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.17.3.tgz#8e8bd20e91df9951e903cabe91f9af4a0895bc1e" - integrity sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw== - -core-js@^3.6.5: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" - integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== - -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= - -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@6.0.0, 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" - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -crc@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== - dependencies: - buffer "^5.1.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" - integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw== - dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" - -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: - 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" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -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" - -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - -crypto-addr-codec@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" - integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== - dependencies: - base-x "^3.0.8" - big-integer "1.6.36" - blakejs "^1.1.0" - bs58 "^4.0.1" - ripemd160-min "0.0.6" - safe-buffer "^5.2.0" - sha3 "^2.1.1" - -crypto-browserify@3.12.0, crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-es@^1.2.2: - version "1.2.7" - resolved "https://registry.yarnpkg.com/crypto-es/-/crypto-es-1.2.7.tgz#754a6d52319a94fb4eb1f119297f17196b360f88" - integrity sha512-UUqiVJ2gUuZFmbFsKmud3uuLcNP2+Opt+5ysmljycFCyhA0+T16XJmo1ev/t5kMChMqWh7IEvURNCqsg+SjZGQ== - -crypto-js@^3.1.9-1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" - integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== - -crypto-js@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" - integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== - dependencies: - camelcase "^6.0.0" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^2.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.3" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.1" - semver "^7.3.2" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== - dependencies: - boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-unit-converter@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" - integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^5.0.0, css-what@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" - integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -d3-array@2, d3-array@^2.3.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" - integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== - dependencies: - internmap "^1.0.0" - -"d3-color@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" - integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== - -"d3-format@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" - integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== - -"d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" - integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== - dependencies: - d3-color "1 - 2" - -"d3-path@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" - integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== - -d3-scale@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" - integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== - dependencies: - d3-array "^2.3.0" - d3-format "1 - 2" - d3-interpolate "1.2.0 - 2" - d3-time "^2.1.1" - d3-time-format "2 - 3" - -d3-shape@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" - integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== - dependencies: - d3-path "1 - 2" - -"d3-time-format@2 - 3": - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" - integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== - dependencies: - d3-time "1 - 2" - -"d3-time@1 - 2", d3-time@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" - integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== - dependencies: - d3-array "2" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -damerau-levenshtein@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" - integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== - -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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-fns@2.x: - version "2.22.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4" - integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg== - -dayjs@1.x: - version "1.10.6" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63" - integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, 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@3.1.0, debug@=3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.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.4.1, decimal.js-light@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -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= - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-equal@^1.0.1, deep-equal@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3, 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= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -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" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -deferred-leveldown@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== - dependencies: - abstract-leveldown "~2.6.0" - -deferred-leveldown@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20" - integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== - dependencies: - abstract-leveldown "~5.0.0" - inherits "^2.0.3" - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -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" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -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= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -dequal@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-browser@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" - integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== - -detect-browser@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-3.0.1.tgz#39beead014347a8a2be1f3c4cb30a0aef2127c44" - integrity sha512-L6b76EfUxnoxGHM5Vz7nrshQPIbOHtitDWpGufrp5srQdJrEYi1xpUVZeFbfssWAJvUWo/iDIVlz8hOP4Z8OCw== - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dijkstrajs@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" - integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -docker-compose@^0.23.2: - version "0.23.13" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.13.tgz#77d37bd05b6a966345f631e6d05e961c79514f06" - integrity sha512-/9fYC4g3AO+qsqxIZhmbVnFvJJPcYEV2yJbAPPXH+6AytU3urIY8lUAXOlvY8sl4u25pdKu1JrOfAmWC7lJDJg== - dependencies: - yaml "^1.10.2" - -docker-modem@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" - integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw== - dependencies: - JSONStream "1.3.2" - debug "^3.2.6" - readable-stream "~1.0.26-4" - split-ca "^1.0.0" - -dockerode@^2.5.8: - version "2.5.8" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" - integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== - dependencies: - concat-stream "~1.6.2" - docker-modem "^1.0.8" - tar-fs "~1.16.3" - -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" - -dom-accessibility-api@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" - integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== - -dom-align@^1.7.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" - integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1, dom-serializer@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -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" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" - integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== - dependencies: - domelementtype "^2.2.0" - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" - integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv-expand@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== - -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -duplexer@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -duplexify@^3.4.2, duplexify@^3.5.1, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -duplexify@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - -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" - -eccrypto@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/eccrypto/-/eccrypto-1.1.6.tgz#846bd1222323036f7a3515613704386399702bd3" - integrity sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A== - dependencies: - acorn "7.1.1" - elliptic "6.5.4" - es6-promise "4.2.8" - nan "2.14.0" - optionalDependencies: - secp256k1 "3.7.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -eip55@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eip55/-/eip55-2.1.0.tgz#a1e870cc6e15fb9ec8d338b68317f3db546728f1" - integrity sha512-jtOfFne69XvSYz58oBXqfKHk1cJwwHcAzKm9jbzOKsedKEaulMPCA4fq2UXS9NaxkdVOdbSG0kg7fM09+K4gjw== - dependencies: - keccak "^1.3.0" - -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723: - version "1.3.776" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.776.tgz#33f6e2423b61f1bdaa8d2a103aae78a09764a75f" - integrity sha512-V0w7eFSBoFPpdw4xexjVPZ770UDZIevSwkkj4W97XbE3IsCsTRFpa7/yXGZ88EOQAUEA09JMMsWK0xsw0kRAYw== - -elliptic@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - 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" - -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" - -elliptic@6.5.4, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - -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.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding-down@5.0.4, encoding-down@~5.0.0: - version "5.0.4" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" - integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== - dependencies: - abstract-leveldown "^5.0.0" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - xtend "^4.0.1" - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: - 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" - -engine.io-client@~3.5.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" - integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.6.2" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" - -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -enhanced-resolve@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enquirer@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.4.tgz#c608f2e1134c7f68c1c9ee056de13f9b31076de9" - integrity sha512-pkYrrDZumL2VS6VBGDhqbajCM2xpkUNLuKfGPjfKaSIBKYopQbqEFyrOkRMIb2HDR/rO1kGhEt/5twBwtzKBXw== - dependencies: - ansi-colors "^3.2.1" - -enquirer@^2.3.0, enquirer@^2.3.5: - 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" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -env-cmd@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/env-cmd/-/env-cmd-10.1.0.tgz#c7f5d3b550c9519f137fdac4dd8fb6866a8c8c4b" - integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== - dependencies: - commander "^4.0.0" - cross-spawn "^7.0.0" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -erc-20-abi@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/erc-20-abi/-/erc-20-abi-1.0.0.tgz#3df0f24458f902cade72f615c532b3b50d18beaf" - integrity sha512-X+kdxwbfegJ5quNHVyJPf72Y8g+rpurR3vA+K2b4jVUuAl3qHMYxnR7ZOJRC/T7kQu3V8XU4/U4mIJ+w5wUaeQ== - -err-code@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= - -err-code@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -err-code@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -errno@^0.1.1, errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.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" - -error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - dependencies: - stackframe "^1.1.1" - -es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.10.3" - 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" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@2.0.3, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= - -es6-promise@4.2.8, es6-promise@^4.0.3, es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escalade@^3.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-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@1.0.5, 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= - -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-airbnb@^18.2.0: - version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" - integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== - dependencies: - eslint-config-airbnb-base "^14.2.1" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-prettier@^6.11.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" - -eslint-config-react-app@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" - integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== - dependencies: - confusing-browser-globals "^1.0.10" - -eslint-import-resolver-node@^0.3.4: - 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.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" - integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== - dependencies: - debug "^3.2.7" - pkg-dir "^2.0.0" - -eslint-plugin-babel@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz#75a2413ffbf17e7be57458301c60291f2cfbf560" - integrity sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g== - dependencies: - eslint-rule-composer "^0.3.0" - -eslint-plugin-flowtype@^5.2.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.8.0.tgz#35b55e4ce559b90efbe913ed33630e391e301481" - integrity sha512-feK1xnUTsMSNTOw9jFw7aVgZl7Ep+ghpta/YEoaV6jbXU6Yso30B7BIj9ObHLzZ5TFJL7D98az080wfykLCrcw== - dependencies: - lodash "^4.17.15" - string-natural-compare "^3.0.1" - -eslint-plugin-import@^2.22.1: - version "2.23.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" - integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== - dependencies: - array-includes "^3.1.3" - array.prototype.flat "^1.2.4" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.1" - find-up "^2.0.0" - has "^1.0.3" - is-core-module "^2.4.0" - minimatch "^3.0.4" - object.values "^1.1.3" - pkg-up "^2.0.0" - read-pkg-up "^3.0.0" - resolve "^1.20.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-jest@^24.1.0: - version "24.3.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz#5f0ca019183c3188c5ad3af8e80b41de6c8e9173" - integrity sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg== - dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" - -eslint-plugin-jsx-a11y@^6.3.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" - integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== - dependencies: - "@babel/runtime" "^7.11.2" - aria-query "^4.2.2" - array-includes "^3.1.1" - ast-types-flow "^0.0.7" - axe-core "^4.0.2" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.6" - emoji-regex "^9.0.0" - has "^1.0.3" - jsx-ast-utils "^3.1.0" - language-tags "^1.0.5" - -eslint-plugin-prettier@^3.1.4: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" - integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-react-hooks@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" - integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== - -eslint-plugin-react@^7.21.5: - version "7.24.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz#eadedfa351a6f36b490aa17f4fa9b14e842b9eb4" - integrity sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q== - dependencies: - array-includes "^3.1.3" - array.prototype.flatmap "^1.2.4" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.0.4" - object.entries "^1.1.4" - object.fromentries "^2.0.4" - object.values "^1.1.4" - prop-types "^15.7.2" - resolve "^2.0.0-next.3" - string.prototype.matchall "^4.0.5" - -eslint-plugin-testing-library@^3.9.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" - integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== - dependencies: - "@typescript-eslint/experimental-utils" "^3.10.1" - -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.2: - 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, eslint-utils@^2.1.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-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.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-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-webpack-plugin@^2.1.0: - version "2.5.4" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz#473b84932f1a8e2c2b8e66a402d0497bf440b986" - integrity sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw== - dependencies: - "@types/eslint" "^7.2.6" - arrify "^2.0.1" - jest-worker "^26.6.2" - micromatch "^4.0.2" - normalize-path "^3.0.0" - schema-utils "^3.0.0" - -eslint@^7.11.0, eslint@^7.5.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" - integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.2" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.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.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -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== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -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== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eth-block-tracker@4.4.3, eth-block-tracker@^4.4.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" - integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== - dependencies: - "@babel/plugin-transform-runtime" "^7.5.5" - "@babel/runtime" "^7.5.5" - eth-query "^2.1.0" - json-rpc-random-id "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - -eth-block-tracker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" - integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== - dependencies: - eth-query "^2.1.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.3" - ethjs-util "^0.1.3" - json-rpc-engine "^3.6.0" - pify "^2.3.0" - tape "^4.6.3" - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-gas-reporter@^0.2.20: - version "0.2.22" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.22.tgz#bbe91f5d7b22433d26f099eeb5b20118ced0e575" - integrity sha512-L1FlC792aTf3j/j+gGzSNlGrXKSxNPXQNk6TnV5NNZ2w3jnQCRyJjDl0zUo25Cq2t90IS5vGdbkwqFQK7Ce+kw== - dependencies: - "@ethersproject/abi" "^5.0.0-beta.146" - "@solidity-parser/parser" "^0.12.0" - cli-table3 "^0.5.0" - colors "^1.1.2" - ethereumjs-util "6.2.0" - ethers "^4.0.40" - fs-readdir-recursive "^1.1.0" - lodash "^4.17.14" - markdown-table "^1.1.3" - mocha "^7.1.1" - req-cwd "^2.0.0" - request "^2.88.0" - request-promise-native "^1.0.5" - sha1 "^1.1.1" - sync-request "^6.0.0" - -eth-json-rpc-errors@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" - integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-json-rpc-errors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" - integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.1.1, eth-json-rpc-filters@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" - integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== - dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - async-mutex "^0.2.6" - eth-json-rpc-middleware "^6.0.0" - eth-query "^2.1.2" - json-rpc-engine "^6.1.0" - pify "^5.0.0" - -eth-json-rpc-infura@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.0" - -eth-json-rpc-infura@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz#623478375ba65e4304dea529ed69e8bd7938270d" - integrity sha512-DFYitKovzVlCdUulEccdm4g6k/vnvyByuw7rd5OoWDBSIiaeinI8Z/SntLjSIs2c+YvE20DGwk/GLwZGCWDN1Q== - dependencies: - eth-json-rpc-middleware "^4.4.0" - eth-rpc-errors "^3.0.0" - json-rpc-engine "^5.1.3" - node-fetch "^2.6.0" - -eth-json-rpc-infura@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" - integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== - dependencies: - eth-json-rpc-middleware "^6.0.0" - eth-rpc-errors "^3.0.0" - json-rpc-engine "^5.3.0" - node-fetch "^2.6.0" - -eth-json-rpc-middleware@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" - integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== - dependencies: - btoa "^1.2.1" - clone "^2.1.1" - eth-json-rpc-errors "^1.0.1" - eth-query "^2.1.2" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.7" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.6.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^5.1.3" - json-stable-stringify "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - -eth-json-rpc-middleware@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" - integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== - dependencies: - btoa "^1.2.1" - clone "^2.1.1" - eth-query "^2.1.2" - eth-rpc-errors "^3.0.0" - eth-sig-util "^1.4.2" - ethereumjs-util "^5.1.2" - json-rpc-engine "^5.3.0" - json-stable-stringify "^1.0.1" - node-fetch "^2.6.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - -eth-lattice-keyring@^0.2.7: - version "0.2.29" - resolved "https://registry.yarnpkg.com/eth-lattice-keyring/-/eth-lattice-keyring-0.2.29.tgz#9b9ad913df465b4068a65a64aece1565c54706dd" - integrity sha512-P2YZJcW2JtWx2y1T2v8oC3xwCJoGnirA1DwjsGhf5CxrSk13+a+pobFaGXF7WN7kSKs6sH6IdynzS/RXqVx36g== - dependencies: - ethereumjs-common "^1.5.2" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^7.0.10" - gridplus-sdk "^0.7.16" - -eth-lib@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" - integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -eth-provider@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/eth-provider/-/eth-provider-0.6.1.tgz#795c69205f023678ed79f9139233426afdbc479c" - integrity sha512-0sBNzOBEUSQmo5zHSQ/os25ULh+LeoTTK5nGxiTJpXo8R0OOxOzYiVWLfAWuIuYLhzT1ma5A1wPZWMt+gPGeoA== - dependencies: - ethereum-provider "0.2.2" - events "3.2.0" - oboe "2.1.5" - uuid "8.3.2" - ws "7.4.3" - xhr2-cookies "1.1.0" - -eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= - dependencies: - json-rpc-random-id "^1.0.0" - xtend "^4.0.1" - -eth-rpc-errors@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" - integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-rpc-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" - integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" - integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-sig-util@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - -eth-sig-util@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= - dependencies: - ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" - ethereumjs-util "^5.1.1" - -eth-sig-util@^2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" - integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== - dependencies: - ethereumjs-abi "0.6.8" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.0" - -eth-sig-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96" - integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.0" - -eth-tx-summary@^3.1.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== - dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" - -ethashjs@~0.0.7: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" - integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== - dependencies: - async "^2.1.2" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.2" - miller-rabin "^4.0.0" - -ethereum-block-by-date@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/ethereum-block-by-date/-/ethereum-block-by-date-1.4.2.tgz#ff7ee7c97db89a983a15c2f651a137ba5a0a1af9" - integrity sha512-nSib8vMu5diAn+pI7KZ3qadw5vkyM19slBDGG97F6WWOuOOaXg9AyJfe7GhcqJRW6VIoEhu0gwUdsURS+r492w== - dependencies: - moment "^2.29.1" - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - -ethereum-checksum-address@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz#46fcb2d962dacd1ed49d7b464408ec26fd183209" - integrity sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ== - dependencies: - keccak256 "^1.0.0" - meow "^5.0.0" - -ethereum-common@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" - integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== - -ethereum-common@^0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= - -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-private-key-to-address@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0" - integrity sha512-P+z9eFlgOezxogEpY1sQR155U4xFmQUWVxKzIJa5BL05Gs7zL0sYuyQuSAme8LBYGQ6p6AwconiMDauf4LbqyA== - dependencies: - ethereum-private-key-to-public-key "0.0.2" - ethereum-public-key-to-address "0.0.1" - meow "^5.0.0" - -ethereum-private-key-to-public-key@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz#bb5803aad43df2692e0d7b4c9eaa224eec2a39cb" - integrity sha512-WKwFspLS5IdpV1rBUmWSG2xtIDV7YMpAG/uSjtV9kDzBU6hpSzoqg6R/e1iEfHkOr/eae+NtDTpwzXRtSMDvhw== - dependencies: - meow "^5.0.0" - secp256k1 "^3.7.1" - -ethereum-provider@0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ethereum-provider/-/ethereum-provider-0.2.2.tgz#37ba0674a6c05915b51afb8e6d13e9bd166f1c33" - integrity sha512-147DaU4nccfYYCAKhrILdgSWTjjZX2NnmcZJx12frM+cNw8cGTbpQPpi4xApagIk7HlN16ZncCP5uyOiZN7n3g== - dependencies: - events "3.2.0" - -ethereum-public-key-to-address@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz#3f0237687d9c2217234dc5683f3eb580abf3f6ce" - integrity sha512-X78x/VBluHUdrYpZunoXJ48luXTaUiUK4ImPjTjI+XiS24+jUR5WFCpm9wCNbLYP6/ZCJ+lwuYormXSjt8rrbw== - dependencies: - ethereum-checksum-address "0.0.2" - keccak256 "^1.0.0" - meow "^5.0.0" - secp256k1 "^3.7.1" - -ethereum-waffle@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720" - integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ== - dependencies: - "@ethereum-waffle/chai" "^3.4.0" - "@ethereum-waffle/compiler" "^3.4.0" - "@ethereum-waffle/mock-contract" "^3.3.0" - "@ethereum-waffle/provider" "^3.4.0" - ethers "^5.0.1" - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": - version "0.6.8" - resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" - integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== - dependencies: - ethereumjs-util "^6.0.0" - rlp "^2.2.1" - safe-buffer "^5.1.1" - -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" - integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== - dependencies: - async "^2.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== - dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-blockchain@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" - integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== - dependencies: - async "^2.6.1" - ethashjs "~0.0.7" - ethereumjs-block "~2.2.2" - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.1.0" - flow-stoplight "^1.0.0" - level-mem "^3.0.1" - lru-cache "^5.1.1" - rlp "^2.2.2" - semaphore "^1.1.0" - -ethereumjs-common@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" - integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== - -ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0, ethereumjs-common@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-testrpc@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz#7a0b87bf3670f92f607f98fa6a78801d9741b124" - integrity sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA== - dependencies: - webpack "^3.0.0" - -ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-util@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" - integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - -ethereumjs-util@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" - integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^2.0.0" - rlp "^2.2.3" - secp256k1 "^3.0.1" - -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.0" - -ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" - integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5" - integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.4" - -ethereumjs-utils@^5.2.5: - version "5.2.5" - resolved "https://registry.yarnpkg.com/ethereumjs-utils/-/ethereumjs-utils-5.2.5.tgz#76db76d021beb00f7d3f2fa9708a080444f079ea" - integrity sha512-IkXL26c21kUKT5NQO4NFgeuYwXtqCD4dmiSWc/vivGNGwfYhEn2lYwmVIcbqVKS9yJfVEmrolWnQBuxEmTinIg== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - -ethereumjs-vm@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" - integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - core-js-pure "^3.0.1" - ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.2" - ethereumjs-blockchain "^4.0.3" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - util.promisify "^1.0.0" - -ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - -ethereumjs-wallet@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== - dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" - utf8 "^3.0.0" - uuid "^3.3.2" - -ethers-eip712@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ethers-eip712/-/ethers-eip712-0.2.0.tgz#52973b3a9a22638f7357283bf66624994c6e91ed" - integrity sha512-fgS196gCIXeiLwhsWycJJuxI9nL/AoUPGSQ+yvd+8wdWR+43G+J1n69LmWVWvAON0M6qNaf2BF4/M159U8fujQ== - -ethers@4.0.47: - version "4.0.47" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" - integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== - dependencies: - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.5.2" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^4.0.32, ethers@^4.0.40, ethers@^4.0.45: - version "4.0.48" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.48.tgz#330c65b8133e112b0613156e57e92d9009d8fbbe" - integrity sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g== - dependencies: - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.5.3" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.13, ethers@^5.0.2, ethers@^5.1.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.1.tgz#bcff1e9f45bf1a061bf313ec04e8d9881d2d53f9" - integrity sha512-SrcddMdCgP1hukDvCPd87Aipbf4NWjQvdfAbZ65XSZGbfyuYPtIrUJPDH5B1SBRsdlfiEgX3eoz28DdBDzMNFg== - dependencies: - "@ethersproject/abi" "5.4.0" - "@ethersproject/abstract-provider" "5.4.0" - "@ethersproject/abstract-signer" "5.4.0" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.0" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.0" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.0" - "@ethersproject/networks" "5.4.1" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.0" - "@ethersproject/providers" "5.4.1" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethers@^5.0.31, ethers@^5.2.0: - version "5.4.5" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.5.tgz#cec133b9f5b514dc55e2561ee7aa7218c33affd7" - integrity sha512-PPZ6flOAj230sXEWf/r/It6ZZ5c7EOVWx+PU87Glkbg79OtT7pLE1WgL4MRdwx6iF7HzSOvUUI+8cAmcdzo12w== - dependencies: - "@ethersproject/abi" "5.4.0" - "@ethersproject/abstract-provider" "5.4.1" - "@ethersproject/abstract-signer" "5.4.1" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.1" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.1" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.0" - "@ethersproject/networks" "5.4.2" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.0" - "@ethersproject/providers" "5.4.4" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethjs-unit@0.1.6, ethjs-unit@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter2@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" - integrity sha1-YZegldX7a1folC9v1+qtY6CclFI= - -eventemitter3@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -eventemitter3@4.0.7, eventemitter3@^4.0.0, eventemitter3@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - -events@^3.0.0, events@^3.1.0, events@^3.2.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.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" - -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" - -execa@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== - 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@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - 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" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exenv@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" - integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - -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@^26.6.0, expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - -explain-error@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" - integrity sha1-p5PTrAytTGq1cemWj7urbLJTKSk= - -express@^4.14.0, express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - 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.0, 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== - -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= - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - -fake-merkle-patricia-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= - dependencies: - checkpoint-store "^1.1.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - 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-equals@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-2.0.3.tgz#7039b0a039909f345a2ce53f6202a14e5f392efc" - integrity sha512-0EMw4TTUxsMDpDkCg0rXor2gsg+npVrMIHbEhvD0HZyIhUX6AktC/yasm+qKwfyswd06Qy95ZKk8p2crTo0iPA== - -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.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, 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= - -fast-safe-stringify@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f" - integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag== - -fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -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" - -fetch-ponyfill@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= - dependencies: - node-fetch "~1.7.1" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" - integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -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== - -filesize@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== - -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" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.3.1: - 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-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= - dependencies: - array-back "^1.0.4" - test-value "^2.1.0" - -find-up@3.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.1.0, find-up@^4.0.0, find-up@^4.1.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" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-versions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" - integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== - dependencies: - semver-regex "^3.1.2" - -find-yarn-workspace-root@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" - integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== - dependencies: - fs-extra "^4.0.3" - micromatch "^3.1.4" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -flatmap@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/flatmap/-/flatmap-0.0.3.tgz#1f18a4d938152d495965f9c958d923ab2dd669b4" - integrity sha1-Hxik2TgVLUlZZfnJWNkjqy3WabQ= - -flatted@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" - integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flow-stoplight@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - -follow-redirects@^1.0.0, follow-redirects@^1.10.0, follow-redirects@^1.12.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== - -for-each@^0.3.3, 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= - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -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= - -fork-ts-checker-webpack-plugin@4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" - integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== - dependencies: - "@babel/code-frame" "^7.5.5" - chalk "^2.4.1" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -form-data@^2.2.0, form-data@^2.3.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -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" - -formidable@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" - integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== - -fortmatic@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-2.2.1.tgz#91ce9159c1fe539bd87e483125fca5c27a410a86" - integrity sha512-PEfPoErJSErU2A8iYD2Mab2c8eJK5dCdCr1jR/8yc49aEAlyQ4UXnZXyeO6MU5zBGkDAZmg9brnRSPzc+8MKPQ== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -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" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^4.0.2, fs-extra@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - 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-extra@^9.0.0, fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-jetpack@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-2.4.0.tgz#6080c4ab464a019d37a404baeb47f32af8835026" - integrity sha512-S/o9Dd7K9A7gicVU32eT8G0kHcmSu0rCVdP79P0MWInKFb8XpTc8Syhoo66k9no+HDshtlh4pUJTws8X+8fdFQ== - dependencies: - minimatch "^3.0.2" - rimraf "^2.6.3" - -fs-minipass@^1.2.5, fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -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" - -fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.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, 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= - -ganache-cli@^6.1.0: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" - integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== - dependencies: - ethereumjs-util "6.2.1" - source-map-support "0.5.12" - yargs "13.2.4" - -ganache-core@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" - integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== - dependencies: - abstract-leveldown "3.0.0" - async "2.6.2" - bip39 "2.5.0" - cachedown "1.0.0" - clone "2.1.2" - debug "3.2.6" - encoding-down "5.0.4" - eth-sig-util "3.0.0" - ethereumjs-abi "0.6.8" - ethereumjs-account "3.0.0" - ethereumjs-block "2.2.2" - ethereumjs-common "1.5.0" - ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.1" - ethereumjs-vm "4.2.0" - heap "0.2.6" - keccak "3.0.1" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.20" - lru-cache "5.1.1" - merkle-patricia-tree "3.0.0" - patch-package "6.2.2" - seedrandom "3.0.1" - source-map-support "0.5.12" - tmp "0.1.0" - web3-provider-engine "14.2.1" - websocket "1.0.32" - optionalDependencies: - ethereumjs-wallet "0.6.5" - web3 "1.2.11" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-browser-rtc@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" - integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -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-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -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-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-port@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0, get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -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.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - 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" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - 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" - -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - 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" - -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -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@^13.6.0, globals@^13.9.0: - version "13.10.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" - integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== - dependencies: - type-fest "^0.20.2" - -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== - -globby@11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -gluegun@^4.3.1: - version "4.7.0" - resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-4.7.0.tgz#d1e88828ec6737d966619fff07c04f7e689dc59e" - integrity sha512-St+J/rly0FoWLeISgBGDuymwF3/b8OdmxBCbSvK1hXEoRbaaATiRpPepJSJWuRYR7cGR7Hy9drgQwGFBAolhbQ== - dependencies: - apisauce "^2.0.1" - app-module-path "^2.2.0" - cli-table3 "~0.5.0" - colors "^1.3.3" - cosmiconfig "6.0.0" - cross-spawn "^7.0.0" - ejs "^2.6.1" - enquirer "2.3.4" - execa "^3.0.0" - fs-jetpack "^2.2.2" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.lowercase "^4.3.0" - lodash.lowerfirst "^4.3.1" - lodash.pad "^4.5.1" - lodash.padend "^4.6.1" - lodash.padstart "^4.6.1" - lodash.repeat "^4.1.0" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.trim "^4.5.1" - lodash.trimend "^4.5.1" - lodash.trimstart "^4.5.1" - lodash.uppercase "^4.3.0" - lodash.upperfirst "^4.3.1" - ora "^4.0.0" - pluralize "^8.0.0" - ramdasauce "^2.1.0" - semver "^7.0.0" - which "^2.0.0" - yargs-parser "^16.1.0" - -google-protobuf@^3.15.8, google-protobuf@^3.7.0-rc.2: - version "3.17.3" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.17.3.tgz#f87595073545a77946c8f0b67c302c5f7646d700" - integrity sha512-OVPzcSWIAJ+d5yiHyeaLrdufQtrvaBrF4JQg+z8ynTkbO3uFcujqXszTumqg1cGsAsjkWnI+M5B1xZ19yR4Wyg== - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - -graphql@^15.5.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.0.tgz#e69323c6a9780a1a4b9ddf7e35ca8904bb04df02" - integrity sha512-WJR872Zlc9hckiEPhXgyUftXH48jp2EjO5tgBBOyNMRJZ9fviL2mJBD6CAysk6N5S0r9BTs09Qk39nnJBkvOXQ== - -gridplus-sdk@^0.7.16: - version "0.7.27" - resolved "https://registry.yarnpkg.com/gridplus-sdk/-/gridplus-sdk-0.7.27.tgz#e63438fc0a676f88d5228e74a28426361e6149d5" - integrity sha512-0Jl5zMooppkR3n3xwdw9u5ayENAZJlcQl2/uBBp9GaYU38U6prfZIR2Y4I4DUfKjefuBf2UmAQCol8NO6bdDwg== - dependencies: - aes-js "^3.1.1" - bech32 "^2.0.0" - bignumber.js "^9.0.1" - bitwise "^2.0.4" - borc "^2.1.2" - bs58check "^2.1.2" - buffer "^5.6.0" - crc-32 "^1.2.0" - elliptic "6.5.4" - ethers "^5.0.31" - ethers-eip712 "^0.2.0" - js-sha3 "^0.8.0" - rlp-browser "^1.0.1" - secp256k1 "4.0.2" - superagent "^3.8.3" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -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= - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== - dependencies: - duplexer "^0.1.1" - pify "^4.0.1" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -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.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hardhat-gas-reporter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz#59e3137e38e0dfeac2e4f90d5c74160b50ad4829" - integrity sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw== - dependencies: - eth-gas-reporter "^0.2.20" - sha1 "^1.1.1" - -hardhat@^2.3.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.3.tgz#093373b383eacec0d3e7fb223353b2f0cb9f2802" - integrity sha512-xgbnhEnmaKau8xT6wPJlzoyMLAZyxQoElACQQCyEeAY1DURpZbYwjIQUywmL/ZNv3QEl38Yqu/n8mPOc2HXyGA== - dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/blockchain" "^5.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - "@ethereumjs/vm" "^5.5.0" - "@ethersproject/abi" "^5.1.2" - "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.11.0" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" - adm-zip "^0.4.16" - ansi-escapes "^4.3.0" - chalk "^2.4.2" - chokidar "^3.4.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - eth-sig-util "^2.5.2" - ethereum-cryptography "^0.1.2" - ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.0" - find-up "^2.1.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - glob "^7.1.3" - https-proxy-agent "^5.0.0" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - lodash "^4.17.11" - merkle-patricia-tree "^4.2.0" - mnemonist "^0.38.0" - mocha "^7.1.2" - node-fetch "^2.6.0" - qs "^6.7.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - slash "^3.0.0" - solc "0.7.3" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" - tsort "0.0.1" - uuid "^3.3.2" - ws "^7.4.6" - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -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-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - -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-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -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.0, has@^1.0.3, 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-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -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.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hdkey@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-2.0.1.tgz#0a211d0c510bfc44fa3ec9d44b13b634641cad74" - integrity sha512-c+tl9PHG9/XkGgG0tD7CJpRVaE0jfZizDNmnErUAKQ4EjQSOcOUcV3EN9ZEZS8pZ4usaeiiK0H7stzuzna8feA== - dependencies: - bs58check "^2.1.2" - safe-buffer "^5.1.1" - secp256k1 "^4.0.0" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - -he@1.2.0, he@^1.1.1, he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -heap@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hi-base32@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - -highlight.js@^10.4.0, highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -highlightjs-solidity@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.2.0.tgz#742ac2eacbd0f1d4aacea39704e58b76b4eb12e3" - integrity sha512-KXYcVzBRof3CBWHsxGffsSEAJF0YsPaOk1jgIYv2xSzrBSxkfNUJFXrlE2oZEWvYQKbPqLe4qprJyNbSDV+LZA== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: - 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" - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - 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== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^1.2.1, html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - -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== - -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== - dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" - he "^1.2.0" - param-case "^3.0.3" - relateurl "^0.2.7" - terser "^4.6.3" - -html-webpack-plugin@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" - integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== - dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-basic@^8.1.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" - integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@1.7.3, http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - -http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.17.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -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" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -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== - -husky@^4.3.7: - version "4.3.8" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" - integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== - dependencies: - chalk "^4.0.0" - ci-info "^2.0.0" - compare-versions "^3.6.0" - cosmiconfig "^7.0.0" - find-versions "^4.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^5.0.0" - please-upgrade-node "^3.2.0" - slash "^3.0.0" - which-pm-runs "^1.0.0" - -iconv-lite@0.4.24, iconv-lite@^0.4.4: - 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" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -identity-obj-proxy@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= - dependencies: - harmony-reflect "^1.4.6" - -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -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== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= - -immer@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" - integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== - -immer@^9.0.1: - version "9.0.5" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.5.tgz#a7154f34fe7064f15f00554cc94c66cc0bf453ec" - integrity sha512-2WuIehr2y4lmYz9gaQzetPR2ECniCifk4ORaQbU3g5EalLt+0IVTosEPJ5BoYl/75ky2mivzdRzV8wWgQGOSYQ== - -immutable@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= - -immutable@^4.0.0-rc.12: - version "4.0.0-rc.14" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.14.tgz#29ba96631ec10867d1348515ac4e6bdba462f071" - integrity sha512-pfkvmRKJSoW7JFx0QeYlAmT+kNYvn5j0u7bnpNq4N2RCvHSTlLT208G8jgaquNe+Q8kCPHKOSpxJkyvLDpYq0w== - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.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" - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.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= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -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" - -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== - -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, invariant@^2.2.2: - 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" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -ip-regex@^2.0.0, ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipfs-block@~0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ipfs-block/-/ipfs-block-0.8.1.tgz#05e1068832775e8f1c2da5b64106cc837fd2acb9" - integrity sha512-0FaCpmij+jZBoUYhjoB5ptjdl9QzvrdRIoBmUU5JiBnK2GA+4YM/ifklaB8ePRhA/rRzhd+KYBjvMFMAL4NrVQ== - dependencies: - cids "~0.7.0" - class-is "^1.1.0" - -ipfs-http-client@^34.0.0: - version "34.0.0" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-34.0.0.tgz#8804d06a11c22306332a8ffa0949b6f672a0c9c8" - integrity sha512-4RCkk8ix4Dqn6sxqFVwuXWCZ1eLFPsVaj6Ijvu1fs9VYgxgVudsW9PWwarlr4mw1xUCmPWYyXnEbGgzBrfMy0Q== - dependencies: - abort-controller "^3.0.0" - async "^2.6.1" - bignumber.js "^9.0.0" - bl "^3.0.0" - bs58 "^4.0.1" - buffer "^5.4.2" - cids "~0.7.1" - concat-stream "github:hugomrdias/concat-stream#feat/smaller" - debug "^4.1.0" - detect-node "^2.0.4" - end-of-stream "^1.4.1" - err-code "^2.0.0" - explain-error "^1.0.4" - flatmap "0.0.3" - glob "^7.1.3" - ipfs-block "~0.8.1" - ipfs-utils "~0.0.3" - ipld-dag-cbor "~0.15.0" - ipld-dag-pb "~0.17.3" - ipld-raw "^4.0.0" - is-ipfs "~0.6.1" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - iso-stream-http "~0.1.2" - iso-url "~0.4.6" - iterable-ndjson "^1.1.0" - just-kebab-case "^1.1.0" - just-map-keys "^1.1.0" - kind-of "^6.0.2" - ky "^0.11.2" - ky-universal "^0.2.2" - lru-cache "^5.1.1" - multiaddr "^6.0.6" - multibase "~0.6.0" - multicodec "~0.5.1" - multihashes "~0.4.14" - ndjson "github:hugomrdias/ndjson#feat/readable-stream3" - once "^1.4.0" - peer-id "~0.12.3" - peer-info "~0.15.1" - promise-nodeify "^3.0.1" - promisify-es6 "^1.0.3" - pull-defer "~0.2.3" - pull-stream "^3.6.9" - pull-to-stream "~0.1.1" - pump "^3.0.0" - qs "^6.5.2" - readable-stream "^3.1.1" - stream-to-pull-stream "^1.7.2" - tar-stream "^2.0.1" - through2 "^3.0.1" - -ipfs-utils@~0.0.3: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-0.0.4.tgz#946114cfeb6afb4454b4ccb10d2327cd323b0cce" - integrity sha512-7cZf6aGj2FG3XJWhCNwn4mS93Q0GEWjtBZvEHqzgI43U2qzNDCyzfS1pei1Y5F+tw/zDJ5U4XG0G9reJxR53Ig== - dependencies: - buffer "^5.2.1" - is-buffer "^2.0.3" - is-electron "^2.2.0" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - kind-of "^6.0.2" - readable-stream "^3.4.0" - -ipld-dag-cbor@~0.15.0: - version "0.15.3" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.15.3.tgz#283afdb81d5b07db8e4fff7a10ef5e517e87f299" - integrity sha512-m23nG7ZyoVFnkK55/bLAErc7EfiMgaEQlqHWDTGzPI+O5r6bPfp+qbL5zTVSIT8tpbHmu174dwerVtLoVgeVyA== - dependencies: - borc "^2.1.2" - buffer "^5.5.0" - cids "~0.8.0" - is-circular "^1.0.2" - multicodec "^1.0.0" - multihashing-async "~0.8.0" - -ipld-dag-pb@~0.17.3: - version "0.17.4" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.17.4.tgz#080841cfdd014d996f8da7f3a522ec8b1f6b6494" - integrity sha512-YwCxETEMuXVspOKOhjIOHJvKvB/OZfCDkpSFiYBQN2/JQjM9y/RFCYzIQGm0wg7dCFLrhvfjAZLTSaKs65jzWA== - dependencies: - cids "~0.7.0" - class-is "^1.1.0" - multicodec "~0.5.1" - multihashing-async "~0.7.0" - protons "^1.0.1" - stable "~0.1.8" - -ipld-raw@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-4.0.1.tgz#49a6f58cdfece5a4d581925b19ee19255be2a29d" - integrity sha512-WjIdtZ06jJEar8zh+BHB84tE6ZdbS/XNa7+XCArOYfmeJ/c01T9VQpeMwdJQYn5c3s5UvvCu7y4VIi3vk2g1bA== - dependencies: - cids "~0.7.0" - multicodec "^1.0.0" - multihashing-async "~0.8.0" - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -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-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== - dependencies: - call-bind "^1.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-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== - -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-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== - dependencies: - call-bind "^1.0.2" - -is-buffer@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -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-buffer@^2.0.2, is-buffer@^2.0.3, is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -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-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" - integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== - 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.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== - -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-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-electron@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0" - integrity sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q== - -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-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -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-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -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-generator-function@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" - integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== - -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, 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-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-2.0.0.tgz#68eea07e8a0a0a94c2d080dd674c731ab2a461ab" - integrity sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas= - dependencies: - ip-regex "^2.0.0" - -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-ipfs@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-0.6.3.tgz#82a5350e0a42d01441c40b369f8791e91404c497" - integrity sha512-HyRot1dvLcxImtDqPxAaY1miO6WsiP/z7Yxpg2qpaLWv5UdhAPtLvHJ4kMLM0w8GSl8AFsVF23PHe1LzuWrUlQ== - dependencies: - bs58 "^4.0.1" - cids "~0.7.0" - mafmt "^7.0.0" - multiaddr "^7.2.1" - multibase "~0.6.0" - multihashes "~0.4.13" - -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-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== - -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-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -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-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-promise@~1, is-promise@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - integrity sha1-MVc3YcBX4zwukaq56W2gjO++duU= - -is-pull-stream@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/is-pull-stream/-/is-pull-stream-0.0.0.tgz#a3bc3d1c6d3055151c46bde6f399efed21440ca9" - integrity sha1-o7w9HG0wVRUcRr3m85nv7SFEDKk= - -is-reference@^1.2.1: - 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.0.4, is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.2" - -is-regex@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-root@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^1.0.0, is-stream@^1.0.1, 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.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== - -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-typed-array@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" - integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.2" - es-abstract "^1.18.0-next.2" - foreach "^2.0.5" - has-symbols "^1.0.1" - -is-typedarray@1.0.0, is-typedarray@^1.0.0, 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-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-what@^3.12.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -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= - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is_js@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/is_js/-/is_js-0.9.0.tgz#0ab94540502ba7afa24c856aa985561669e9c52d" - integrity sha1-CrlFQFArp6+iTIVqqYVWFmnpxS0= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -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= - -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - -isarray@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -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= - -iso-random-stream@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-1.1.2.tgz#c703da2c518db573277c5678cc43c5298283d64c" - integrity sha512-7y0tsBBgQs544iTYjyrMp5xvgrbYR8b+plQq1Bryp+03p0LssrxC9C1M0oHv4QESDt7d95c74XvMk/yawKqX+A== - dependencies: - buffer "^6.0.3" - readable-stream "^3.4.0" - -iso-stream-http@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-stream-http/-/iso-stream-http-0.1.2.tgz#b3dfea4c9f23ff26d078d40c539cfc0dfebacd37" - integrity sha512-oHEDNOysIMTNypbg2f1SlydqRBvjl4ZbSE9+0awVxnkx3K2stGTFwB/kpVqnB6UEfF8QD36kAjDwZvqyXBLMnQ== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^3.1.1" - -iso-url@~0.4.6, iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - -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= - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -iterable-ndjson@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterable-ndjson/-/iterable-ndjson-1.1.0.tgz#36f7e8a5bb04fd087d384f29e44fc4280fc014fc" - integrity sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg== - dependencies: - string_decoder "^1.2.0" - -jayson@^3.0.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.4.tgz#9e9d1ba2a75d811f254bceff61a096772fa04832" - integrity sha512-GH63DsRFFlodS8krFgAhxwYvQFmSwjsFxKnPrHQtp+BJj/tpeSj3hyBGGqmTkuq043U1Gn6u8VdsVRFZX1EEiQ== - dependencies: - "@types/connect" "^3.4.33" - "@types/express-serve-static-core" "^4.17.9" - "@types/lodash" "^4.14.159" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - lodash "^4.17.20" - uuid "^3.4.0" - ws "^7.4.5" - -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-circus@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" - integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.0" - "@jest/test-result" "^26.6.0" - "@jest/types" "^26.6.0" - "@types/babel__traverse" "^7.0.4" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^26.6.0" - is-generator-fn "^2.0.0" - jest-each "^26.6.0" - jest-matcher-utils "^26.6.0" - jest-message-util "^26.6.0" - jest-runner "^26.6.0" - jest-runtime "^26.6.0" - jest-snapshot "^26.6.0" - jest-util "^26.6.0" - pretty-format "^26.6.0" - stack-utils "^2.0.2" - throat "^5.0.0" - -jest-cli@^26.6.0: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" - prompts "^2.0.1" - yargs "^15.4.1" - -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^26.0.0, jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.6.0, jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== - dependencies: - chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-message-util@^26.6.0, jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - 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@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" - -jest-resolve@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" - integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== - dependencies: - "@jest/types" "^26.6.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.0" - read-pkg-up "^7.0.1" - resolve "^1.17.0" - slash "^3.0.0" - -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" - slash "^3.0.0" - -jest-runner@^26.6.0, jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.0, jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - cjs-module-lexer "^0.6.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" - -jest-util@^26.6.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-watch-typeahead@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" - integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - jest-regex-util "^26.0.0" - jest-watcher "^26.3.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - -jest-watcher@^26.3.0, jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== - dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.6.2" - string-length "^4.0.1" - -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-worker@^26.5.0, jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" - integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== - dependencies: - "@jest/core" "^26.6.0" - import-local "^3.0.2" - jest-cli "^26.6.0" - -js-sha256@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - -js-sha3@0.8.0, js-sha3@^0.8.0, js-sha3@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-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.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbi@^3.1.1: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.5.tgz#70c2aaa2f75e1dc7604fed45298061ca23724046" - integrity sha512-w2BY0VOYC1ahe+w6Qhl4SFoPvPsZ9NPHY4bwass+LCgU7RK3PBoVQlQ3G1s7vI8W3CYyJiEXcbKF7FIM/L8q3Q== - -jsbi@^3.1.5: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.1.tgz#513a8f404abb9d5ba725f5265265b688215ee9f0" - integrity sha512-NzcT09wuJReIO829enrY3yRdHFz+ciVIq01PCGPkHlwIv5Dj9v2F4daQ4akwuPHf6xO/oii4Jrd3BsPepOxXrg== - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.4.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -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-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" - integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== - dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - eth-rpc-errors "^4.0.2" - -json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" - -json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" - integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== - dependencies: - eth-rpc-errors "^3.0.0" - safe-event-emitter "^1.0.1" - -json-rpc-error@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= - dependencies: - inherits "^2.0.1" - -json-rpc-middleware-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-middleware-stream/-/json-rpc-middleware-stream-3.0.0.tgz#8540331d884f36b9e0ad31054cc68ac6b5a89b52" - integrity sha512-JmZmlehE0xF3swwORpLHny/GvW3MZxCsb2uFNBrn8TOqMqivzCfz232NSDLLOtIQlrPlgyEjiYpyzyOPFOzClw== - dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - readable-stream "^2.3.3" - -json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= - -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-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -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-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@^5.0.1, 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= - -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I= - dependencies: - delimit-stream "0.1.0" - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= - dependencies: - string-convert "^0.2.0" - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -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" - -json5@^2.1.2, json5@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -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" - -jsqr@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsqr/-/jsqr-1.4.0.tgz#8efb8d0a7cc6863cb6d95116b9069123ce9eb2d1" - integrity sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" - integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== - dependencies: - array-includes "^3.1.2" - object.assign "^4.1.2" - -just-kebab-case@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" - integrity sha512-QkuwuBMQ9BQHMUEkAtIA4INLrkmnnveqlFB1oFi09gbU0wBdZo6tTnyxNWMR84zHxBuwK7GLAwqN8nrvVxOLTA== - -just-map-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/just-map-keys/-/just-map-keys-1.1.0.tgz#9663c9f971ba46e17f2b05e66fec81149375f230" - integrity sha512-oNKi+4y7fr8lXnhKYpBbCkiwHRVkAnx0VDkCeTDtKKMzGr1Lz1Yym+RSieKUTKim68emC5Yxrb4YmiF9STDO+g== - -keccak256@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.3.tgz#0a9c0383a9cda753a7351811cf69eaa607043366" - integrity sha512-EkF/4twuPm1V/gn75nejOUrKfDUJn87RMLzDWosXF3pXuOvesiSgX35GcmbqzdImCASEkE/WaklWGWSa+Ha5bQ== - dependencies: - bn.js "^4.11.8" - keccak "^3.0.1" - -keccak@3.0.1, keccak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keccak@^1.0.2, keccak@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== - dependencies: - bindings "^1.2.1" - inherits "^2.0.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -keccak@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" - integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== - dependencies: - bindings "^1.5.0" - inherits "^2.0.4" - nan "^2.14.0" - safe-buffer "^5.2.0" - -keccak@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keypair@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.3.tgz#4314109d94052a0acfd6b885695026ad29529c80" - integrity sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ== - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -keyvaluestorage-interface@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" - integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -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== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -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== - -ky-universal@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.2.2.tgz#7a36e1a75641a98f878157463513965f799f5bfe" - integrity sha512-fb32o/fKy/ux2ALWa9HU2hvGtfOq7/vn2nH0FpVE+jwNzyTeORlAbj3Fiw+WLMbUlmVqZIWupnLZ2USHvqwZHw== - dependencies: - abort-controller "^3.0.0" - node-fetch "^2.3.0" - -ky@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/ky/-/ky-0.11.2.tgz#4ffe6621d9d9ab61bf0f5500542e3a96d1ba0815" - integrity sha512-5Aou5BWue5/mkPqIRqzSWW+0Hkl403pr/2AIrCKYw7cVl/Xoe8Xe4KLBO0PRjbz7GnRe1/8wW1KhqQNFFE7/GQ== - -language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== - -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" - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -less@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" - integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^2.5.2" - source-map "~0.6.0" - -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-codec@~7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" - integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== - dependencies: - errno "~0.1.1" - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-errors@~1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" - integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== - dependencies: - errno "~0.1.1" - -level-iterator-stream@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" - integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.5" - xtend "^4.0.0" - -level-iterator-stream@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= - dependencies: - inherits "^2.0.1" - level-errors "^1.0.3" - readable-stream "^1.0.33" - xtend "^4.0.0" - -level-iterator-stream@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730" - integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.3.6" - xtend "^4.0.0" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" - integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== - dependencies: - level-packager "~4.0.0" - memdown "~3.0.0" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-packager@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" - integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== - dependencies: - encoding-down "~5.0.0" - levelup "^3.0.0" - -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" - integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== - dependencies: - bytewise "~1.1.0" - level-codec "^9.0.0" - level-errors "^2.0.0" - level-iterator-stream "^2.0.3" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" - -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level-ws@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= - dependencies: - readable-stream "~1.0.15" - xtend "~2.1.1" - -level-ws@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" - integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.8" - xtend "^4.0.1" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - -levelup@3.1.1, levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== - dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" - -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== - dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" - xtend "~4.0.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -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== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.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" - -libp2p-crypto-secp256k1@~0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/libp2p-crypto-secp256k1/-/libp2p-crypto-secp256k1-0.3.1.tgz#4cbeb857f5cfe5fefb1253e6b2994420c0ca166e" - integrity sha512-evrfK/CeUSd/lcELUdDruyPBvxDmLairth75S32OLl3H+++2m2fV24JEtxzdFS9JH3xEFw0h6JFO8DBa1bP9dA== - dependencies: - async "^2.6.2" - bs58 "^4.0.1" - multihashing-async "~0.6.0" - nodeify "^1.0.1" - safe-buffer "^5.1.2" - secp256k1 "^3.6.2" - -libp2p-crypto@~0.16.1: - version "0.16.4" - resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.16.4.tgz#fb1a4ba39d56789303947784b5b0d6cefce12fdc" - integrity sha512-II8HxKc9jbmQp34pprlluNxsBCWJDjHRPYJzuRy7ragztNip9Zb7uJ4lCje6gGzz4DNAcHkAUn+GqCIK1592iA== - dependencies: - asmcrypto.js "^2.3.2" - asn1.js "^5.0.1" - async "^2.6.1" - bn.js "^4.11.8" - browserify-aes "^1.2.0" - bs58 "^4.0.1" - iso-random-stream "^1.1.0" - keypair "^1.0.1" - libp2p-crypto-secp256k1 "~0.3.0" - multihashing-async "~0.5.1" - node-forge "^0.10.0" - pem-jwk "^2.0.0" - protons "^1.0.1" - rsa-pem-to-jwk "^1.1.3" - tweetnacl "^1.0.0" - ursa-optional "~0.10.0" - -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@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -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" - -loader-runner@^2.3.0, loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@2.0.0, loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -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" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= - -lodash.lowercase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz#46515aced4acb0b7093133333af068e4c3b14e9d" - integrity sha1-RlFaztSssLcJMTMzOvBo5MOxTp0= - -lodash.lowerfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" - integrity sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0= - -lodash.memoize@^4.1.2: - 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.pad@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - integrity sha1-QzCUmoM6fI2iLMIPaibE1Z3runA= - -lodash.padend@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= - -lodash.padstart@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= - -lodash.partition@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4" - integrity sha1-o45GtzRp4EILDaEhLmbUFL42S6Q= - -lodash.repeat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.repeat/-/lodash.repeat-4.1.0.tgz#fc7de8131d8c8ac07e4b49f74ffe829d1f2bec44" - integrity sha1-/H3oEx2MisB+S0n3T/6CnR8r7EQ= - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= - -lodash.sum@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b" - integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s= - -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash.trim@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trim/-/lodash.trim-4.5.1.tgz#36425e7ee90be4aa5e27bcebb85b7d11ea47aa57" - integrity sha1-NkJefukL5KpeJ7zruFt9EepHqlc= - -lodash.trimend@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trimend/-/lodash.trimend-4.5.1.tgz#12804437286b98cad8996b79414e11300114082f" - integrity sha1-EoBENyhrmMrYmWt5QU4RMAEUCC8= - -lodash.trimstart@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz#8ff4dec532d82486af59573c39445914e944a7f1" - integrity sha1-j/TexTLYJIavWVc8OURZFOlEp/E= - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash.uppercase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.uppercase/-/lodash.uppercase-4.3.0.tgz#c404abfd1469f93931f9bb24cf6cc7d57059bc73" - integrity sha1-xASr/RRp+Tkx+bskz2zH1XBZvHM= - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= - -lodash@4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@3.0.0, log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -logging@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/logging/-/logging-3.3.0.tgz#5743f9154f790308c5d6f2e28196dd0259fcf0ad" - integrity sha512-Hnmu3KlGTbXMVS7ONjBpnjjiF9cBlK5qsmj77sOcqRkNpvO9ouUGPKe2PmBCWWYpKAbxb96b08cYEv4hiBk3lQ== - dependencies: - chalk "^4.1.0" - debug "^4.3.1" - nicely-format "^1.1.0" - -loglevel@^1.6.8, loglevel@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@~3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, 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" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@5.1.1, lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= - dependencies: - pseudomap "^1.0.1" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - -ltgt@^2.1.2, ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= - -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= - -lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= - -mafmt@^6.0.2: - version "6.0.10" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-6.0.10.tgz#3ad251c78f14f8164e66f70fd3265662da41113a" - integrity sha512-FjHDnew6dW9lUu3eYwP0FvvJl9uvNbqfoJM+c1WJcSyutNEIlyu6v3f/rlPnD1cnmue38IjuHlhBdIh3btAiyw== - dependencies: - multiaddr "^6.1.0" - -mafmt@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" - integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== - dependencies: - multiaddr "^7.3.0" - -magic-string@^0.25.0, magic-string@^0.25.7: - 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.0.0, 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.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" - -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-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -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-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -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" - -markdown-table@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -mcl-wasm@^0.7.1: - version "0.7.8" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.8.tgz#4d0dc5a92f7bd20892fd3fcd41764acf86fd1e6e" - integrity sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw== - dependencies: - typescript "^4.3.4" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memdown@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= - dependencies: - abstract-leveldown "~2.7.1" - functional-red-black-tree "^1.0.1" - immediate "^3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - -memdown@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" - integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== - dependencies: - abstract-leveldown "~5.0.0" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memory-cache@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" - integrity sha1-eJCwHVLADI68nVM+H46xfjA0hxo= - -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= - -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -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== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merkle-patricia-tree@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1" - integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.0.10" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - rlp "^2.2.4" - semaphore-async-await "^1.5.1" - -methods@^1.1.1, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -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" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== - -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.0.0, 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== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-create-react-context@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" - integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - -mini-css-extract-plugin@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" - integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -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, minimatch@^3.0.2, 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-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, 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== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^1.2.1, minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -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-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0, 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" - -mnemonist@^0.38.0: - version "0.38.3" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" - integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== - dependencies: - obliterator "^1.6.1" - -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mocha@^7.1.1, mocha@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - -moment@^2.24.0, moment@^2.25.3, moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -mri@^1.1.5: - 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.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multiaddr@^6.0.3, multiaddr@^6.0.6, multiaddr@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-6.1.1.tgz#9aae57b3e399089b9896d9455afa8f6b117dff06" - integrity sha512-Q1Ika0F9MNhMtCs62Ue+GWIJtRFEhZ3Xz8wH7/MZDVZTWhil1/H2bEGN02kUees3hkI3q1oHSjmXYDM0gxaFjQ== - dependencies: - bs58 "^4.0.1" - class-is "^1.1.0" - hi-base32 "~0.5.0" - ip "^1.1.5" - is-ip "^2.0.0" - varint "^5.0.0" - -multiaddr@^7.2.1, multiaddr@^7.3.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" - integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== - dependencies: - buffer "^5.5.0" - cids "~0.8.0" - class-is "^1.1.0" - is-ip "^3.1.0" - multibase "^0.7.0" - varint "^5.0.0" - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^1.0.0, multibase@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" - integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -multicodec@^0.5.5, multicodec@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0, multicodec@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.13, multihashes@~0.4.14, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -multihashes@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" - integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== - dependencies: - buffer "^5.6.0" - multibase "^1.0.1" - varint "^5.0.0" - -multihashing-async@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.5.2.tgz#4af40e0dde2f1dbb12a7c6b265181437ac26b9de" - integrity sha512-mmyG6M/FKxrpBh9xQDUvuJ7BbqT93ZeEeH5X6LeMYKoYshYLr9BDdCsvDtZvn+Egf+/Xi+aOznrWL4vp3s+p0Q== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.6.0.tgz#c1fc6696a624b9bf39b160b0c4c4e7ba3f394453" - integrity sha512-Qv8pgg99Lewc191A5nlXy0bSd2amfqlafNJZmarU6Sj7MZVjpR94SCxQjf4DwPtgWZkiLqsjUQBXA2RSq+hYyA== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.7.0.tgz#3234fb98295be84386b85bfd20377d3e5be20d6b" - integrity sha512-SCbfl3f+DzJh+/5piukga9ofIOxwfT05t8R4jfzZIJ88YE9zU9+l3K2X+XB19MYyxqvyK9UJRNWbmQpZqQlbRA== - dependencies: - blakejs "^1.1.0" - buffer "^5.2.1" - err-code "^1.1.2" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js-revisited "^3.0.0" - -multihashing-async@~0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.8.2.tgz#3d5da05df27d83be923f6d04143a0954ff87f27f" - integrity sha512-2lKa1autuCy8x7KIEj9aVNbAb3aIMRFYIwN7mq/zD4pxgNIVgGlm+f6GKY4880EOF2Y3GktHYssRy7TAJQ2DyQ== - dependencies: - blakejs "^1.1.0" - buffer "^5.4.3" - err-code "^2.0.0" - js-sha3 "^0.8.0" - multihashes "^1.0.1" - murmurhash3js-revisited "^3.0.0" - -multimatch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" - integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -murmurhash3js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/murmurhash3js/-/murmurhash3js-3.0.1.tgz#3e983e5b47c2a06f43a713174e7e435ca044b998" - integrity sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg= - -mustache@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -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.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - -nan@^2.14.2, nan@^2.2.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nano-base32@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" - integrity sha1-ulSMh578+5DaHE2eCX20pGySVe8= - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= - -nanoid@^3.1.23: - version "3.1.23" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== - -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" - -native-url@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" - integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== - dependencies: - querystring "^0.2.0" - -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= - -ndjson@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8" - integrity sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg= - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.0" - split2 "^2.1.0" - through2 "^2.0.3" - -"ndjson@github:hugomrdias/ndjson#feat/readable-stream3": - version "1.5.0" - resolved "https://codeload.github.com/hugomrdias/ndjson/tar.gz/4db16da6b42e5b39bf300c3a7cde62abb3fa3a11" - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.0" - split2 "^3.1.0" - through2 "^3.0.0" - -needle@^2.2.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -needle@^2.5.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.8.0.tgz#1c8ef9c1a2c29dcc1e83d73809d7bc681c80a048" - integrity sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nicely-format@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/nicely-format/-/nicely-format-1.1.0.tgz#6c3513d1f38077d65ed9721e716a8e1917ba27b6" - integrity sha1-bDUT0fOAd9Ze2XIecWqOGRe6J7Y= - dependencies: - ansi-styles "^2.2.1" - esutils "^2.0.2" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" - integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= - -node-fetch@^2.3.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.3.tgz#57b29b34400e9c52346cbfb575cf3d10f7a49e92" - integrity sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@~1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-gyp-build@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== - -node-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-libs-browser@^2.0.0, node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -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@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-pre-gyp@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42" - integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.61, node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -node-watch@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c" - integrity sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g== - -nodeify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" - integrity sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0= - dependencies: - is-promise "~1.0.0" - promise "~1.3.0" - -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-hex@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" - integrity sha512-E2dx7XJQnjsm6SkS4G6GGvIXRHaLeWAZE2D2N3aia+OpIif2UT8y4S0KCjrX3WmFDSeFnlNOp0FSHFjLeJ4SJw== - dependencies: - bn.js "^4.11.8" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: - 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, 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== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -npm-bundled@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -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" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" - integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== - dependencies: - boolbase "^1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - 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@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - -object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -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.10.3, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-inspect@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -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-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= - -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.0, 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.0, object.entries@^1.1.2, object.entries@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" - integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - -object.fromentries@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" - integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - -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.0, object.values@^1.1.3, object.values@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" - integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - -obliterator@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" - integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== - -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= - dependencies: - http-https "^1.0.0" - -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -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@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^7.0.2, open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -opencollective-postinstall@^2.0.0, opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimist@~0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" - integrity sha1-yQlBrVnkJzMokjB00s8ufLxuwNk= - dependencies: - wordwrap "~0.0.2" - -optimize-css-assets-webpack-plugin@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" - integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.1: - 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" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -ora@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc" - integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== - dependencies: - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-spinners "^2.2.0" - is-interactive "^1.0.0" - log-symbols "^3.0.0" - mute-stream "0.0.8" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@^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= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -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-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -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-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.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-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - -p-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== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -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-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha1-juqz5U+laSD+Fro493+iGqzC104= - -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - 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.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -patch-package@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" - integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -patch-package@^6.2.2: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -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@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -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, path-is-absolute@^1.0.1: - 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-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -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: - 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-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -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== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbjs@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/pbjs/-/pbjs-0.0.5.tgz#b4c88e15aac4552ca0922aa64cd5338efd3447bf" - integrity sha1-tMiOFarEVSygkiqmTNUzjv00R78= - dependencies: - bytebuffer "5.0.1" - commander "2.9.0" - protocol-buffers-schema "3.1.0" - -pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -peer-id@~0.12.2, peer-id@~0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.12.5.tgz#b22a1edc5b4aaaa2bb830b265ba69429823e5179" - integrity sha512-3xVWrtIvNm9/OPzaQBgXDrfWNx63AftgFQkvqO6YSZy7sP3Fuadwwbn54F/VO9AnpyW/26i0WRQz9FScivXrmw== - dependencies: - async "^2.6.3" - class-is "^1.1.0" - libp2p-crypto "~0.16.1" - multihashes "~0.4.15" - -peer-info@~0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/peer-info/-/peer-info-0.15.1.tgz#21254a7c516d0dd046b150120b9aaf1b9ad02146" - integrity sha512-Y91Q2tZRC0CpSTPd1UebhGqniOrOAk/aj60uYUcWJXCoLTAnGu+4LJGoiay8ayudS6ice7l3SKhgL/cS62QacA== - dependencies: - mafmt "^6.0.2" - multiaddr "^6.0.3" - peer-id "~0.12.2" - unique-by "^1.0.0" - -pem-jwk@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085" - integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA== - dependencies: - asn1.js "^5.0.1" - -penpal@3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/penpal/-/penpal-3.0.7.tgz#d252711ed93b30f1d867eb82342785b3a95f5f75" - integrity sha512-WSXiq5HnEvzvY05SHhaXcsviUmCvh4Ze8AiIZzvmdzaaYAAx4rx8c6Xq6+MaVDG/Nfve3VmGD8HyRP3CkPvPbQ== - -penpal@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/penpal/-/penpal-4.1.1.tgz#c96ccfdac441682acf617f6dcbc177a614e8302b" - integrity sha512-6d1f8khVLyBz3DnhLztbfjJ7+ANxdXRM2l6awpnCdEtbrmse4AGTsELOvGuNY0SU7xZw7heGbP6IikVvaVTOWw== - -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= - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@4.0.1, 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== - -pify@^2.0.0, pify@^2.3.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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -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, pkg-dir@^4.2.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" - -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - -pkg-up@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - -pkginfo@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= - -platform@^1.3.5: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== - -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -pngjs@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -pocket-js-core@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/pocket-js-core/-/pocket-js-core-0.0.3.tgz#1ab278b9a6a5775e2bdc3c2c2e218057774061e4" - integrity sha512-OUTEvEVutdjLT6YyldvAlSebpBueUUWg2XKxGNt5u3QqrmLpBOOBmdDnGMNJ+lEwXtko+JqgwFq+HTi4g1QDVg== - dependencies: - axios "^0.18.0" - -portfinder@^1.0.26: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -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= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-browser-comments@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" - integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== - dependencies: - postcss "^7" - -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== - dependencies: - postcss "^7.0.26" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== - dependencies: - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" - integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== - dependencies: - "@csstools/normalize.css" "^10.1.0" - browserslist "^4.6.2" - postcss "^7.0.17" - postcss-browser-comments "^3.0.0" - sanitize.css "^10.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" - -postcss-safe-parser@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" - integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== - dependencies: - postcss "^8.1.0" - -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@7.0.36, postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^8.1.0: - version "8.3.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" - integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - -prb-math@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/prb-math/-/prb-math-2.2.0.tgz#9cbe103924e790a08e9e0005dac34c041f82523e" - integrity sha512-lDcHpG8i4prKxKmc4Wn4OkwbIOArLKx5mAWOgWSCYfacINePp2NsVckw6k9IGkjYKJPJZJYEUjv/sRU3SJhJkw== - -preact@10.4.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" - integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== - -preact@^10.5.9: - version "10.5.14" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701" - integrity sha512-KojoltCrshZ099ksUZ2OQKfbH66uquFoxHSbnwKbTJHeQNvx42EmC7wQVWNuDt6vC5s3nudRHFtKbpY4ijKlaQ== - -precond@0.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -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= - -prepend-http@^1.0.0, prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -prettier-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.13.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.1.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" - integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== - -pretty-bytes@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== - dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" - -pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -pretty-quick@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.1.tgz#93ca4e2dd38cc4e970e3f54a0ead317a25454688" - integrity sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ== - dependencies: - chalk "^3.0.0" - execa "^4.0.0" - find-up "^4.1.0" - ignore "^5.1.4" - mri "^1.1.5" - multimatch "^4.0.0" - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - -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== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -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== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-nodeify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2" - integrity sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg== - -promise-to-callback@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= - dependencies: - is-fn "^1.0.0" - set-immediate-shim "^1.0.1" - -promise-ws@^1.0.0-1: - version "1.0.0-1" - resolved "https://registry.yarnpkg.com/promise-ws/-/promise-ws-1.0.0-1.tgz#14ccf6279a016dd509b4f2cc61aa69dc1afb536d" - integrity sha512-VtDegdCu9VKKNVv/4H3qj0+dG1Qrg1wGb7ZLY0qUYfEVkEw4c2B+2i1hIFlB31KEg36YNg3i62yMr3JIdmbu9Q== - dependencies: - pify "^3.0.0" - ws "^6.0.0" - -promise@^8.0.0, promise@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== - dependencies: - asap "~2.0.6" - -promise@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" - integrity sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU= - dependencies: - is-promise "~1" - -promisify-es6@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/promisify-es6/-/promisify-es6-1.0.3.tgz#b012668c4df3c965ce13daac2b3a4d1726a96346" - integrity sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA== - -prompts@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.0, prop-types@^15.6.2, 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" - -protocol-buffers-encodings@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.1.tgz#f1e4a386711823137330171d2c82b49d062e75d3" - integrity sha512-5aFshI9SbhtcMiDiZZu3g2tMlZeS5lhni//AGJ7V34PQLU5JA91Cva7TIs6inZhYikS3OpnUzAUuL6YtS0CyDA== - dependencies: - signed-varint "^2.0.1" - varint "5.0.0" - -protocol-buffers-schema@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.0.tgz#d8a819549ead3e6bd189ebe9e50e96636bbc5cc7" - integrity sha1-2KgZVJ6tPmvRievp5Q6WY2u8XMc= - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -protons@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/protons/-/protons-1.2.1.tgz#5f1e0db8b2139469cd1c3b4e332a4c2d95d0a218" - integrity sha512-2oqDyc/SN+tNcJf8XxrXhYL7sQn2/OMl8mSdD7NVGsWjMEmAbks4eDVnCyf0vAoRbBWyWTEXWk4D8XfuKVl3zg== - dependencies: - buffer "^5.5.0" - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - varint "^5.0.0" - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.1, pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= - -pull-defer@^0.2.2, pull-defer@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8, pull-stream@^3.6.9: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pull-to-stream@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pull-to-stream/-/pull-to-stream-0.1.1.tgz#fa2058528528e3542b81d6f17cbc42288508ff37" - integrity sha512-thZkMv6F9PILt9zdvpI2gxs19mkDrlixYKX6cOBxAW16i1NZH+yLAmF4r8QfJ69zuQh27e01JZP9y27tsH021w== - dependencies: - readable-stream "^3.1.1" - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= - dependencies: - looper "^2.0.0" - -pump@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -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" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -pumpify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" - integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== - dependencies: - duplexify "^4.1.1" - inherits "^2.0.3" - pump "^3.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -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== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qr.js@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" - integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8= - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qrcode.react@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-1.0.1.tgz#2834bb50e5e275ffe5af6906eff15391fe9e38a5" - integrity sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg== - dependencies: - loose-envify "^1.4.0" - prop-types "^15.6.0" - qr.js "0.0.0" - -qrcode@1.4.4, qrcode@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" - integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== - dependencies: - buffer "^5.4.3" - buffer-alloc "^1.2.0" - buffer-from "^1.1.1" - dijkstrajs "^1.0.1" - isarray "^2.0.1" - pngjs "^3.3.0" - yargs "^13.2.4" - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@^6.4.0, qs@^6.5.1, qs@^6.5.2, qs@^6.7.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== - dependencies: - side-channel "^1.0.4" - -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== - -query-string@6.13.5: - version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" - integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== - dependencies: - decode-uri-component "^0.2.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -query-string@^6.10.1: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2, queue-microtask@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -raf@^3.4.0, raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -ramda@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" - integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= - -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" - integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== - -ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== - -ramdasauce@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ramdasauce/-/ramdasauce-2.1.3.tgz#acb45ecc7e4fc4d6f39e19989b4a16dff383e9c2" - integrity sha512-Ml3CPim4SKwmg5g9UI77lnRSeKr/kQw7YhQ6rfdMcBYy6DMlwmkEwQqjygJ3OhxPR+NfFfpjKl3Tf8GXckaqqg== - dependencies: - ramda "^0.24.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -randomhex@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" - integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc-align@^4.0.0: - version "4.0.9" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.9.tgz#46d8801c4a139ff6a65ad1674e8efceac98f85f2" - integrity sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - dom-align "^1.7.0" - rc-util "^5.3.0" - resize-observer-polyfill "^1.5.1" - -rc-cascader@~1.4.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.4.3.tgz#d91b0dcf8157b60ebe9ec3e58b4db054d5299464" - integrity sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - rc-trigger "^5.0.4" - rc-util "^5.0.1" - warning "^4.0.1" - -rc-checkbox@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1" - integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-collapse@~3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.1.1.tgz#2421d454e85781d1cf2f04f906918e0677d779e6" - integrity sha512-/oetKApTHzGGeR8Q8vD168EXkCs2MpEIrURGyy2D+LrrJd29LY/huuIMvOiJoSV6W3bcGhJqIdgHtg1Dxn1smA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.2.1" - shallowequal "^1.1.0" - -rc-dialog@~8.5.0, rc-dialog@~8.5.1: - version "8.5.2" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.5.2.tgz#530e289c25a31c15c85a0e8a4ba3f33414bff418" - integrity sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.6.1" - -rc-drawer@~4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.3.1.tgz#356333a7af01b777abd685c96c2ce62efb44f3f3" - integrity sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.7.0" - -rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.2.0.tgz#da6c2ada403842baee3a9e909a0b1a91ba3e1090" - integrity sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-trigger "^5.0.4" - -rc-field-form@~1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.20.1.tgz#d1c51888107cf075b42704b7b575bef84c359291" - integrity sha512-f64KEZop7zSlrG4ef/PLlH12SLn6iHDQ3sTG+RfKBM45hikwV1i8qMf53xoX12NvXXWg1VwchggX/FSso4bWaA== - dependencies: - "@babel/runtime" "^7.8.4" - async-validator "^3.0.3" - rc-util "^5.8.0" - -rc-image@~5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.2.4.tgz#ff1059f937bde6ca918c6f1beb316beba911f255" - integrity sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-dialog "~8.5.0" - rc-util "^5.0.6" - -rc-input-number@~7.1.0: - version "7.1.4" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.1.4.tgz#9d7410c91ff8dc6384d0233c20df278982989f9a" - integrity sha512-EG4iqkqyqzLRu/Dq+fw2od7nlgvXLEatE+J6uhi3HXE1qlM3C7L6a7o/hL9Ly9nimkES2IeQoj3Qda3I0izj3Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.9.8" - -rc-mentions@~1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae" - integrity sha512-LDzGI8jJVGnkhpTZxZuYBhMz3avcZZqPGejikchh97xPni/g4ht714Flh7DVvuzHQ+BoKHhIjobHnw1rcP8erg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-menu "^9.0.0" - rc-textarea "^0.3.0" - rc-trigger "^5.0.4" - rc-util "^5.0.1" - -rc-menu@^9.0.0, rc-menu@~9.0.12: - version "9.0.12" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.0.12.tgz#492c4bb07a596e2ce07587c669b27ee28c3810c5" - integrity sha512-8uy47DL36iDEwVZdUO/fjhhW5+4j0tYlrCsOzw6iy8MJqKL7/HC2pj7sL/S9ayp2+hk9fYQYB9Tu+UN+N2OOOQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.2.0" - rc-trigger "^5.1.2" - rc-util "^5.12.0" - shallowequal "^1.1.0" - -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0, rc-motion@^2.4.3: - version "2.4.4" - resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" - integrity sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.2.1" - -rc-notification@~4.5.7: - version "4.5.7" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1" - integrity sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.2.0" - rc-util "^5.0.1" - -rc-overflow@^1.0.0, rc-overflow@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.2.tgz#95b0222016c0cdbdc0db85f569c262e7706a5f22" - integrity sha512-X5kj9LDU1ue5wHkqvCprJWLKC+ZLs3p4He/oxjZ1Q4NKaqKBaYf5OdSzRSgh3WH8kSdrfU8LjvlbWnHgJOEkNQ== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.5.1" - -rc-pagination@~3.1.6: - version "3.1.7" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.7.tgz#13ba071a7fcb0c79896076806f3944653e7bf29e" - integrity sha512-sl0HGVhv6AsMzA5H3q7cBQcbAGj/sFjoiDSLvq3+/4IjihPqScZnSSiqR4Wu9G8RLgNjrBnGrSdTGO2Kyrt3IA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - -rc-picker@~2.5.10: - version "2.5.14" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.5.14.tgz#dfa919f7f7cc72496df45cb1cad9c82ad2fc019b" - integrity sha512-+tGDsrZQxwv1pLKYulaYqmTIXOdOCj2Lcl1mAt5C7Z6WYvWYYi9VF/tVgOznN7tMFUj65qgT+pue6RjRluVk1g== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - date-fns "2.x" - dayjs "1.x" - moment "^2.24.0" - rc-trigger "^5.0.4" - rc-util "^5.4.0" - shallowequal "^1.1.0" - -rc-progress@~3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.1.4.tgz#66040d0fae7d8ced2b38588378eccb2864bad615" - integrity sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - -rc-rate@~2.9.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.9.1.tgz#e43cb95c4eb90a2c1e0b16ec6614d8c43530a731" - integrity sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.0.1" - -rc-resize-observer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz#97fb89856f62fec32ab6e40933935cf58e2e102d" - integrity sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.0.0" - resize-observer-polyfill "^1.5.1" - -rc-select@^12.0.0, rc-select@~12.1.6: - version "12.1.13" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-12.1.13.tgz#c33560ccb9339d30695b52458f55efc35af35273" - integrity sha512-cPI+aesP6dgCAaey4t4upDbEukJe+XN0DK6oO/6flcCX5o28o7KNZD7JAiVtC/6fCwqwI/kSs7S/43dvHmBl+A== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.0.0" - rc-trigger "^5.0.4" - rc-util "^5.9.8" - rc-virtual-list "^3.2.0" - -rc-slider@~9.7.1: - version "9.7.2" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.2.tgz#282f571f7582752ebaa33964e441184f4e79ad74" - integrity sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-tooltip "^5.0.1" - rc-util "^5.0.0" - shallowequal "^1.1.0" - -rc-steps@~4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.3.tgz#208580e22db619e3830ddb7fa41bc886c65d9803" - integrity sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA== - dependencies: - "@babel/runtime" "^7.10.2" - classnames "^2.2.3" - rc-util "^5.0.1" - -rc-switch@~3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" - integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.0.1" - -rc-table@~7.15.1: - version "7.15.2" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.15.2.tgz#f6ab73b2cfb1c76f3cf9682c855561423c6b5b22" - integrity sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-resize-observer "^1.0.0" - rc-util "^5.13.0" - shallowequal "^1.1.0" - -rc-tabs@~11.9.1: - version "11.9.1" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.9.1.tgz#5b2e74da9a276978c2172ef9a05ae8af14da74cb" - integrity sha512-CLNx3qaWnO8KBWPd+7r52Pfk0MoPyKtlr+2ltWq2I9iqAjd1nZu6iBpQP7wbWBwIomyeFNw/WjHdRN7VcX5Qtw== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "2.x" - rc-dropdown "^3.2.0" - rc-menu "^9.0.0" - rc-resize-observer "^1.0.0" - rc-util "^5.5.0" - -rc-textarea@^0.3.0, rc-textarea@~0.3.0: - version "0.3.4" - resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.4.tgz#1408a64c87b5e76db5c847699ef9ab5ee97dd6f9" - integrity sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.7.0" - -rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" - integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA== - dependencies: - "@babel/runtime" "^7.11.2" - rc-trigger "^5.0.0" - -rc-tree-select@~4.3.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.3.3.tgz#28eba4d8a8dc8c0f9b61d83ce465842a6915eca4" - integrity sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "^12.0.0" - rc-tree "^4.0.0" - rc-util "^5.0.5" - -rc-tree@^4.0.0, rc-tree@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-4.2.2.tgz#4429187cbbfbecbe989714a607e3de8b3ab7763f" - integrity sha512-V1hkJt092VrOVjNyfj5IYbZKRMHxWihZarvA5hPL/eqm7o2+0SNkeidFYm7LVVBrAKBpOpa0l8xt04uiqOd+6w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.0.0" - rc-virtual-list "^3.0.1" - -rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1: - version "5.2.9" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.9.tgz#795a787d2b038347dcde27b89a4a5cec8fc40f3e" - integrity sha512-0Bxsh2Xe+etejMn73am+jZBcOpsueAZiEKLiGoDfA0fvm/JHLNOiiww3zJ0qgyPOTmbYxhsxFcGOZu+VcbaZhQ== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-align "^4.0.0" - rc-motion "^2.0.0" - rc-util "^5.5.0" - -rc-upload@~4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.1.tgz#d6ee66b8bd1e1dd2f78526c486538423f7e7ed84" - integrity sha512-W8Iyv0LRyEnFEzpv90ET/i1XG2jlPzPxKkkOVtDfgh9c3f4lZV770vgpUfiyQza+iLtQLVco3qIvgue8aDiOsQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.13.0, rc-util@^5.13.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: - version "5.13.2" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.13.2.tgz#a8a0bb77743351841ba8bed6393e03b8d2f685c8" - integrity sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog== - dependencies: - "@babel/runtime" "^7.12.5" - react-is "^16.12.0" - shallowequal "^1.1.0" - -rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.3.0.tgz#2f95a6ddbbf63d78b28662b57f1e69f7472762fe" - integrity sha512-lVXpGWC6yMdwV2SHo6kc63WlqjCnb3eO72V726KA2/wh9KA6wi/swcdR3zAowuA8hJxG/lRANmY5kpLZ+Pz3iQ== - dependencies: - classnames "^2.2.6" - rc-resize-observer "^1.0.0" - rc-util "^5.0.7" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-app-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" - integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== - dependencies: - core-js "^3.6.5" - object-assign "^4.1.1" - promise "^8.1.0" - raf "^3.4.1" - regenerator-runtime "^0.13.7" - whatwg-fetch "^3.4.1" - -react-dev-utils@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" - integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== - dependencies: - "@babel/code-frame" "7.10.4" - address "1.1.2" - browserslist "4.14.2" - chalk "2.4.2" - cross-spawn "7.0.3" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.1.0" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "4.1.6" - global-modules "2.0.0" - globby "11.0.1" - gzip-size "5.1.1" - immer "8.0.1" - is-root "2.1.0" - loader-utils "2.0.0" - open "^7.0.2" - pkg-up "3.1.0" - prompts "2.4.0" - react-error-overlay "^6.0.9" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - -react-dom@16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" - integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== - -react-is@16.10.2: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" - integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-modal@^3.12.1: - version "3.14.3" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.14.3.tgz#7eb7c5ec85523e5843e2d4737cc17fc3f6aeb1c0" - integrity sha512-+C2KODVKyu20zHXPJxfOOcf571L1u/EpFlH+oS/3YDn8rgVE51QZuxuuIwabJ8ZFnOEHaD+r6XNjqwtxZnXO0g== - dependencies: - exenv "^1.2.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.0" - warning "^4.0.3" - -react-qr-reader@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-qr-reader/-/react-qr-reader-2.2.1.tgz#dc89046d1c1a1da837a683dd970de5926817d55b" - integrity sha512-EL5JEj53u2yAOgtpAKAVBzD/SiKWn0Bl7AZy6ZrSf1lub7xHwtaXe6XSx36Wbhl1VMGmvmrwYMRwO1aSCT2fwA== - dependencies: - jsqr "^1.2.0" - prop-types "^15.7.2" - webrtc-adapter "^7.2.1" - -react-redux@^7.2.2: - version "7.2.4" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.4.tgz#1ebb474032b72d806de2e0519cd07761e222e225" - integrity sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA== - dependencies: - "@babel/runtime" "^7.12.1" - "@types/react-redux" "^7.1.16" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.13.1" - -react-refresh@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== - -react-resize-detector@^6.6.3: - version "6.7.6" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-6.7.6.tgz#4416994e5ead7eba76606e3a248a1dfca49b67a3" - integrity sha512-/6RZlul1yePSoYJxWxmmgjO320moeLC/khrwpEVIL+D2EjLKhqOwzFv+H8laMbImVj7Zu4FlMa0oA7au3/ChjQ== - dependencies: - "@types/resize-observer-browser" "^0.1.6" - lodash.debounce "^4.0.8" - lodash.throttle "^4.1.1" - resize-observer-polyfill "^1.5.1" - -react-router-dom@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" - integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.2.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" - integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - mini-create-react-context "^0.4.0" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-scripts@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.1.tgz#34974c0f4cfdf1655906c95df6a04d80db8b88f0" - integrity sha512-NnniMSC/wjwhcJAyPJCWtxx6CWONqgvGgV9+QXj1bwoW/JI++YF1eEf3Upf/mQ9KmP57IBdjzWs1XvnPq7qMTQ== - dependencies: - "@babel/core" "7.12.3" - "@pmmmwh/react-refresh-webpack-plugin" "0.4.2" - "@svgr/webpack" "5.4.0" - "@typescript-eslint/eslint-plugin" "^4.5.0" - "@typescript-eslint/parser" "^4.5.0" - babel-eslint "^10.1.0" - babel-jest "^26.6.0" - babel-loader "8.1.0" - babel-plugin-named-asset-import "^0.3.7" - babel-preset-react-app "^10.0.0" - bfj "^7.0.2" - camelcase "^6.1.0" - case-sensitive-paths-webpack-plugin "2.3.0" - css-loader "4.3.0" - dotenv "8.2.0" - dotenv-expand "5.1.0" - eslint "^7.11.0" - eslint-config-react-app "^6.0.0" - eslint-plugin-flowtype "^5.2.0" - eslint-plugin-import "^2.22.1" - eslint-plugin-jest "^24.1.0" - eslint-plugin-jsx-a11y "^6.3.1" - eslint-plugin-react "^7.21.5" - eslint-plugin-react-hooks "^4.2.0" - eslint-plugin-testing-library "^3.9.2" - eslint-webpack-plugin "^2.1.0" - file-loader "6.1.1" - fs-extra "^9.0.1" - html-webpack-plugin "4.5.0" - identity-obj-proxy "3.0.0" - jest "26.6.0" - jest-circus "26.6.0" - jest-resolve "26.6.0" - jest-watch-typeahead "0.6.1" - mini-css-extract-plugin "0.11.3" - optimize-css-assets-webpack-plugin "5.0.4" - pnp-webpack-plugin "1.6.4" - postcss-flexbugs-fixes "4.2.1" - postcss-loader "3.0.0" - postcss-normalize "8.0.1" - postcss-preset-env "6.7.0" - postcss-safe-parser "5.0.2" - prompts "2.4.0" - react-app-polyfill "^2.0.0" - react-dev-utils "^11.0.1" - react-refresh "^0.8.3" - resolve "1.18.1" - resolve-url-loader "^3.1.2" - sass-loader "8.0.2" - semver "7.3.2" - style-loader "1.3.0" - terser-webpack-plugin "4.2.3" - ts-pnp "1.2.0" - url-loader "4.1.1" - webpack "4.44.2" - webpack-dev-server "3.11.0" - webpack-manifest-plugin "2.2.0" - workbox-webpack-plugin "5.1.4" - optionalDependencies: - fsevents "^2.1.3" - -react-smooth@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.0.tgz#561647b33e498b2e25f449b3c6689b2e9111bf91" - integrity sha512-wK4dBBR6P21otowgMT9toZk+GngMplGS1O5gk+2WSiHEXIrQgDvhR5IIlT74Vtu//qpTcipkgo21dD7a7AUNxw== - dependencies: - fast-equals "^2.0.0" - raf "^3.4.0" - react-transition-group "2.9.0" - -react-transition-group@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== - dependencies: - dom-helpers "^3.4.0" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" - -react@16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -react@^17, react@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.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" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - 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" - -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~1.0.15, readable-stream@~1.0.26-4: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -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" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recharts-scale@^0.4.4: - version "0.4.5" - resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" - integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== - dependencies: - decimal.js-light "^2.4.1" - -recharts@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.2.tgz#ceeb01e53fb46da0d946a1e0f82d783ddf5b9d06" - integrity sha512-rwFQT6T4imhLzD1kYtg9ql8YOesbFRdSwZi95KWgi5udbBdLGRCR4SgaPO8kf0URHcC23mdRbLLTMYCnXng7zQ== - dependencies: - "@types/d3-scale" "^3.0.0" - "@types/d3-shape" "^2.0.0" - classnames "^2.2.5" - d3-interpolate "^2.0.1" - d3-scale "^3.2.3" - d3-shape "^2.0.0" - eventemitter3 "^4.0.1" - lodash "^4.17.19" - react-is "16.10.2" - react-resize-detector "^6.6.3" - react-smooth "^2.0.0" - recharts-scale "^0.4.4" - reduce-css-calc "^2.1.8" - -recursive-readdir@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reduce-css-calc@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" - integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== - dependencies: - css-unit-converter "^1.1.1" - postcss-value-parser "^3.3.0" - -redux-thunk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== - -redux@^4.0.0, redux@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" - integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== - dependencies: - "@babel/runtime" "^7.9.2" - -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.2.1, regenerate@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -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.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - 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.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -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" - -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== - 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.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -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.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -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= - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.2, 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= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -req-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha1-1AgrTURZgDZkD7c93qAe1T20nrw= - dependencies: - req-from "^2.0.0" - -req-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA= - dependencies: - resolve-from "^3.0.0" - -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.79.0, request@^2.85.0, request@^2.88.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-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= - -require-from-string@^2.0.0, require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -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== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" - integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== - -resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -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-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.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-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve-url-loader@^3.1.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" - integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== - dependencies: - adjust-sourcemap-loader "3.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.36" - rework "1.0.1" - rework-visit "1.0.0" - source-map "0.6.1" - -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.17.0, resolve@~1.17.0: - 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.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" - -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - -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== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, 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, rimraf@^3.0.2: - 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" - -ripemd160-min@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" - integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp-browser@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rlp-browser/-/rlp-browser-1.0.1.tgz#d1ea37f289359200d33dfa006d46008a288761eb" - integrity sha512-JU+9ntlfyKanOOPwtNuMZBmCQ/fWVoryfa7ZSYDTUKAa1zk4v2smvM0WV8BsskJuqn/DdxpO7HO2vEikMvmhOA== - dependencies: - buffer "^5.4.2" - -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== - dependencies: - bn.js "^4.11.1" - -rollup-plugin-babel@^4.3.3: - 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-terser@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" - integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== - dependencies: - "@babel/code-frame" "^7.5.5" - jest-worker "^24.9.0" - rollup-pluginutils "^2.8.2" - serialize-javascript "^4.0.0" - terser "^4.6.2" - -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.31.1: - 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" - -rsa-pem-to-jwk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/rsa-pem-to-jwk/-/rsa-pem-to-jwk-1.1.3.tgz#245e76bdb7e7234cfee7ca032d31b54c38fab98e" - integrity sha1-JF52vbfnI0z+58oDLTG1TDj6uY4= - dependencies: - object-assign "^2.0.0" - rsa-unpack "0.0.6" - -rsa-unpack@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/rsa-unpack/-/rsa-unpack-0.0.6.tgz#f50ebd56a628378e631f297161026ce9ab4eddba" - integrity sha1-9Q69VqYoN45jHylxYQJs6atO3bo= - dependencies: - optimist "~0.3.5" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -rtcpeerconnection-shim@^1.2.14, rtcpeerconnection-shim@^1.2.15: - version "1.2.15" - resolved "https://registry.yarnpkg.com/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz#e7cc189a81b435324c4949aa3dfb51888684b243" - integrity sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw== - dependencies: - sdp "^2.6.0" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@6, rxjs@^6.4.0, rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, 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-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - 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-event-emitter@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" - integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== - dependencies: - events "^3.0.0" - -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.1.2 < 3.0.0", 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" - -sanitize.css@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" - integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== - -sass-loader@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== - dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" - -sass@^1.38.1: - version "1.38.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.38.1.tgz#54dfb17fb168846b5850324b82fc62dc68f51bad" - integrity sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw== - dependencies: - chokidar ">=3.0.0 <4.0.0" - -sax@^1.2.4, 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== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.0.tgz#95986eb604f66daadeed56e379bfe7a7f963cdb9" - integrity sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w== - dependencies: - "@types/json-schema" "^7.0.7" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -scroll-into-view-if-needed@^2.2.25: - version "2.2.28" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" - integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w== - dependencies: - compute-scroll-into-view "^1.0.17" - -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= - dependencies: - pbkdf2 "^3.0.3" - -sdp@^2.12.0, sdp@^2.6.0, sdp@^2.9.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/sdp/-/sdp-2.12.0.tgz#338a106af7560c86e4523f858349680350d53b22" - integrity sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw== - -secp256k1@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1" - integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.4.1" - nan "^2.14.0" - safe-buffer "^5.1.2" - -secp256k1@4.0.2, secp256k1@^4.0.0, secp256k1@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== - dependencies: - elliptic "^6.5.2" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -secp256k1@^3.0.1, secp256k1@^3.6.2, secp256k1@^3.7.1, secp256k1@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - -secure-random@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/secure-random/-/secure-random-1.1.2.tgz#ed103b460a851632d420d46448b2a900a41e7f7c" - integrity sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ== - -seedrandom@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" - integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.7: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - -semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -semver-regex@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" - integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.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@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== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.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.0.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@~5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -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" - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg= - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - -sha3@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" - integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== - dependencies: - buffer "6.0.3" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -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== - -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -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.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== - -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk= - dependencies: - varint "~5.0.0" - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-peer@^9.6.2: - version "9.11.0" - resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.0.tgz#e8d27609c7a610c3ddd75767da868e8daab67571" - integrity sha512-qvdNu/dGMHBm2uQ7oLhQBMhYlrOZC1ywXNCH/i8I4etxR1vrjCnU6ZSQBptndB1gcakjo2+w4OHo7Sjza1SHxg== - dependencies: - buffer "^6.0.3" - debug "^4.3.1" - err-code "^3.0.1" - get-browser-rtc "^1.1.0" - queue-microtask "^1.2.3" - randombytes "^2.1.0" - readable-stream "^3.6.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.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" - -socket.io-client@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" - integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== - dependencies: - component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.4.0" - websocket-driver "0.6.5" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@^0.6.3: - version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" - integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - 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-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.11: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.13, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: - 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.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, 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== - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -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.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-ca@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" - integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -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" - -split2@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split2@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^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" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stable@^0.1.8, stable@~0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -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" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -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= - -store@2.0.12, store@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" - integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -stream-to-pull-stream@^1.7.1, stream-to-pull-stream@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-natural-compare@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" - integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.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, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.matchall@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" - integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - -string.prototype.trim@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" - integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - -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.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.0.0, string_decoder@^1.1.1, string_decoder@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== - dependencies: - safe-buffer "~5.1.0" - -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" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@6.0.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-ansi@^3.0.0, strip-ansi@^3.0.1: - 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-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.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-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -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-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "1.0.0" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.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== - -sturdy-websocket@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/sturdy-websocket/-/sturdy-websocket-0.1.12.tgz#84bb779f948b585a695f76961dc7d1c4a5e87629" - integrity sha512-PA7h8LdjaMoIlC5HAwLVzae4raGWgyroscV4oUpEiTtEFINcNa47/CKYT3e98o+FfsJgrclI2pYpaJrz0aaoew== - dependencies: - lodash.defaults "^4.2.0" - -style-loader@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -super-split@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/super-split/-/super-split-1.1.0.tgz#43b3ba719155f4d43891a32729d59b213d9155fc" - integrity sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ== - -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -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@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - -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.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -svg-parser@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^1.0.0, svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -sync-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" - integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== - dependencies: - http-response-object "^3.0.1" - sync-rpc "^1.2.1" - then-request "^6.0.0" - -sync-rpc@^1.2.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" - integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== - dependencies: - get-port "^3.1.0" - -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tape@^4.6.3: - version "4.13.3" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" - integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== - dependencies: - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.6" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.0.5" - minimist "~1.2.5" - object-inspect "~1.7.0" - resolve "~1.17.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.1" - through "~2.3.8" - -tar-fs@~1.16.3: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar-stream@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^4: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -tar@^4.0.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -tar@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -tempy@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== - dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: - 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" - -terser@^5.3.4: - version "5.7.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" - integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - -text-table@0.2.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= - -then-request@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" - integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== - dependencies: - "@types/concat-stream" "^1.6.0" - "@types/form-data" "0.0.33" - "@types/node" "^8.0.0" - "@types/qs" "^6.2.31" - caseless "~0.12.0" - concat-stream "^1.6.0" - form-data "^2.2.0" - http-basic "^8.1.1" - http-response-object "^3.0.1" - promise "^8.0.0" - qs "^6.4.0" - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^3.0.0, through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - -"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tiny-invariant@^1.0.2, 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-secp256k1@^1.1.3, tiny-secp256k1@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" - integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== - dependencies: - bindings "^1.3.0" - bn.js "^4.11.8" - create-hmac "^1.1.7" - elliptic "^6.4.0" - nan "^2.13.2" - -tiny-warning@^1.0.0, 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-promise@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a" - integrity sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA== - dependencies: - tmp "^0.2.0" - -tmp@0.0.33, 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" - -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -tmp@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -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-hex@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/to-hex/-/to-hex-0.0.11.tgz#22355e09e5b56f5ae2b32502c493320f021171ac" - integrity sha512-3FSU8sfjrVc9fWowwP9xrdhxbp5Wco8uVZLhMhfsNuCFo9Fu8ecD2MgJV/2iAw+755W3AcGSQYVZGOpBmJtNcA== - dependencies: - normalize-hex "0.0.2" - -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-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -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== - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@^2.3.3, 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" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trezor-connect@^8.1.9: - version "8.1.29" - resolved "https://registry.yarnpkg.com/trezor-connect/-/trezor-connect-8.1.29.tgz#8cccf0e4d4101d2331d3e56d60eb39d08d557f44" - integrity sha512-SYIT2C3mqNxTsDTglqgz6FyhgXbBFBo0q5WH9ABkyLUarjPNNt2PrmmgF5nT78RE5GwX5QvHoGl9Efis6+4e5Q== - dependencies: - "@babel/runtime" "^7.12.5" - events "^3.2.0" - whatwg-fetch "^3.5.0" - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -ts-essentials@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" - integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -ts-pnp@1.2.0, ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tsconfig-paths@^3.9.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" - integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== - dependencies: - json5 "^2.2.0" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, 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== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -tslib@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= - -tsutils@^3.17.1, tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -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-util@^0.15.0: - version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -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= - -tweetnacl@^1.0.0, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -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-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -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== - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" - -typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typeforce@^1.11.5: - version "1.18.0" - resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" - integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== - -typescript@^4.0.3, typescript@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== - -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - -u2f-api@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" - integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== - -uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -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" - -underscore@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -underscore@latest: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== - -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" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-by@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-by/-/unique-by-1.0.0.tgz#5220c86ba7bc572fb713ad74651470cb644212bd" - integrity sha1-UiDIa6e8Vy+3E610ZRRwy2RCEr0= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unorm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -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, upath@^1.1.2, upath@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - 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= - -url-loader@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-parse@^1.4.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" - integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -ursa-optional@~0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681" - integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A== - dependencies: - bindings "^1.5.0" - nan "^2.14.2" - -use-deep-compare-effect@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.6.1.tgz#061a0ac5400aa0461e33dddfaa2a98bca873182a" - integrity sha512-VB3b+7tFI81dHm8buGyrpxi8yBhzYZdyMX9iBJra7SMFMZ4ci4FJ1vFc1nvChiB1iLv4GfjqaYfvbNEpTT1rFQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@types/react" "^17.0.0" - dequal "^2.0.2" - -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== - -utf-8-validate@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1" - integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ== - dependencies: - node-gyp-build "^4.2.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util.promisify@^1.0.0, util.promisify@^1.0.1: - 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" - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -util@^0.12.0, util@^0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== - -uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuidv4@6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.0.6.tgz#6966e8dd15760528a0f954843d24fdfdfda5a329" - integrity sha512-10YcruyGJtsG5SJnPG+8atr8toJa7xAOrcO7B7plYYiwpH1mQ8UZHjNSa2MrwGi6KWuyVrXGHr+Rce22F9UAiw== - dependencies: - uuid "7.0.2" - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -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" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -varint@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" - integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= - -varint@^5.0.0, varint@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -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" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -vue@^2.6.10: - version "2.6.14" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" - integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== - -w3c-hr-time@^1.0.2: - 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" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.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" - -walletlink@^2.1.9: - version "2.1.10" - resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.1.10.tgz#f69b816bc1aacc11fb4f0385419e3ef7ef322058" - integrity sha512-ndX2yaa8KDzlxiuiLmrA4pJlD4CXjyCoxm4FqaeGqv/ez3WfwIRa+ZjSDpi7odHiz6sTgi/L6zy16fiocWfHJA== - dependencies: - "@metamask/safe-event-emitter" "2.0.0" - bind-decorator "^1.0.11" - bn.js "^5.1.1" - buffer "^6.0.3" - clsx "^1.1.0" - eth-block-tracker "4.4.3" - eth-json-rpc-filters "4.2.2" - eth-rpc-errors "4.0.2" - js-sha256 "0.9.0" - json-rpc-engine "6.1.0" - keccak "^3.0.1" - preact "^10.5.9" - rxjs "^6.6.3" - stream-browserify "^3.0.0" - util "^0.12.4" - -warning@^4.0.1, warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.4.0, watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -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" - -web-vitals@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" - integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== - -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-bzz@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.4.0.tgz#78a5db3544624b6709b2554094d931639f6f85b8" - integrity sha512-KhXmz8hcfGsqhplB7NrekAeNkG2edHjXV4bL3vnXde8RGMWpabpSNxuwiGv+dv/3nWlrHatH0vGooONYCkP5TA== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.12.1" - -web3-bzz@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.0.tgz#fed3f0895b4c51392eed4557235c1aaf79e0810b" - integrity sha512-IqlecWpwTMO/O5qa0XZZubQh4GwAtO/CR+e2FQ/7oB5eXQyre3DZ/MYu8s5HCLxCR33Fcqda9q2dbNtm1wSQYw== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-helpers@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.4.0.tgz#5cbed46dd325b9498f6fafb15aed4a4295cce514" - integrity sha512-8Ebq0nmRfzw7iPoXbIRHEWOuPh+1cOV3OOEvKm5Od3McZOjja914vdk+DM3MgmbSpDzYJRFM6KoF0+Z/U/1bPw== - dependencies: - underscore "1.12.1" - web3-eth-iban "1.4.0" - web3-utils "1.4.0" - -web3-core-helpers@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.0.tgz#bca7645aaf2f22910df15d6d359e7f466b5d65ca" - integrity sha512-7s5SrJbG5O0C0Oi9mqKLYchco72djZhk59B7kTla5vUorAxMc99SY7k9BoDgwbFl2dlZon2GtFUEW2RXUNkb1g== - dependencies: - web3-eth-iban "1.5.0" - web3-utils "1.5.0" - -web3-core-helpers@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.2.tgz#b6bd5071ca099ba3f92dfafb552eed2b70af2795" - integrity sha512-U7LJoeUdQ3aY9t5gU7t/1XpcApsWm+4AcW5qKl/44ZxD44w0Dmsq1c5zJm3GuLr/a9MwQfXK4lpmvxVQWHHQRg== - dependencies: - web3-eth-iban "1.5.2" - web3-utils "1.5.2" - -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.4.0.tgz#0e26001e4029d359731b25a82e0bed4d1bef8392" - integrity sha512-KW9922fEkgKu8zDcJR8Iikg/epsuWMArAUVTipKVwzAI5TVdvOMRgSe/b7IIDRUIeoeXMARmJ+PrAlx+IU2acQ== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.12.1" - web3-core-helpers "1.4.0" - web3-core-promievent "1.4.0" - web3-core-subscriptions "1.4.0" - web3-utils "1.4.0" - -web3-core-method@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.0.tgz#1940e4da7def63d00f9141b84c4d0d66d25428a7" - integrity sha512-izPhpjbn9jVBjMeFcsU7a5+/nqni9hS5oU+d00HJGTVbp8KV6zplhYw4GjkRqyy6OQzooO8Gx2MMUyRdv5x1wg== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.0" - web3-core-promievent "1.5.0" - web3-core-subscriptions "1.5.0" - web3-utils "1.5.0" - -web3-core-method@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.2.tgz#d1d602657be1000a29d11e3ca3bf7bc778dea9a5" - integrity sha512-/mC5t9UjjJoQmJJqO5nWK41YHo+tMzFaT7Tp7jDCQsBkinE68KsUJkt0jzygpheW84Zra0DVp6q19gf96+cugg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.2" - web3-core-promievent "1.5.2" - web3-core-subscriptions "1.5.2" - web3-utils "1.5.2" - -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.4.0.tgz#531644dab287e83653d983aeb3d9daa0f894f775" - integrity sha512-YEwko22kcry7lHwbe0k80BrjXCZ+73jMdvZtptRH5k2B+XZ1XtmXwYL1PFIlZy9V0zgZijdg+3GabCnAHjVXAw== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.0.tgz#fab9fe72520e46d8fee73ccf8d2f15243e4bc4fd" - integrity sha512-7GkbOIMtcp1qN8LRMMmwIhulzEldT+3Mu7ii2WgAcFFKT1yzUl6Gmycf8mmoEKpAuADAQ9Qeyk0PskTR6rTYlQ== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.2.tgz#2dc9fe0e5bbeb7c360fc1aac5f12b32d9949a59b" - integrity sha512-5DacbJXe98ozSor7JlkTNCy6G8945VunRRkPxMk98rUrg60ECVEM/vuefk1atACzjQsKx6tmLZuHxbJQ64TQeQ== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-requestmanager@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.4.0.tgz#39043da0e1a1b1474f85af531df786e6036ef4b3" - integrity sha512-qIwKJO5T0KkUAIL7y9JRSUkk3+LaCwghdUHK8FzbMvq6R1W9lgCBnccqFGEI76EJjHvsiw4kEKBEXowdB3xenQ== - dependencies: - underscore "1.12.1" - util "^0.12.0" - web3-core-helpers "1.4.0" - web3-providers-http "1.4.0" - web3-providers-ipc "1.4.0" - web3-providers-ws "1.4.0" - -web3-core-requestmanager@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.0.tgz#126427fb29efe15bbac090d3aad09b3842c6dbf6" - integrity sha512-Sr5T2JuXOAsINJ2tf7Rgi2a+Dy2suBDKT8eMc1pcspPmaBhvTKOQfM9XdsO4yjJKYw6tt/Tagw4GKZm4IOx7mw== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.0" - web3-providers-http "1.5.0" - web3-providers-ipc "1.5.0" - web3-providers-ws "1.5.0" - -web3-core-requestmanager@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.2.tgz#43ccc00779394c941b28e6e07e217350fd1ded71" - integrity sha512-oRVW9OrAsXN2JIZt68OEg1Mb1A9a/L3JAGMv15zLEFEnJEGw0KQsGK1ET2kvZBzvpFd5G0EVkYCnx7WDe4HSNw== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.2" - web3-providers-http "1.5.2" - web3-providers-ipc "1.5.2" - web3-providers-ws "1.5.2" - -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core-subscriptions@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.4.0.tgz#ec44e5cfe7bffe0c2a9da330007f88e08e1b5837" - integrity sha512-/UMC9rSLEd0U+h6Qanx6CM29o/cfUyGWgl/HM6O/AIuth9G+34QBuKDa11Gr2Qg6F8Lr9tSFm8QIGVniOx9i5A== - dependencies: - eventemitter3 "4.0.4" - underscore "1.12.1" - web3-core-helpers "1.4.0" - -web3-core-subscriptions@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.0.tgz#c7f77fc0db061cd9290987b08540f91e9d4b8bca" - integrity sha512-dx9P1mZvJkQRiYpSo9SvFhYNzy5E9GHeLOc3uqxPaDxKU7Cu9fJnFHo/P6+wfD6ZhGIP23ZLK/uyor5UpdTqDQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.0" - -web3-core-subscriptions@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.2.tgz#8eaebde44f81fc13c45b555c4422fe79393da9cf" - integrity sha512-hapI4rKFk22yurtIv0BYvkraHsM7epA4iI8Np+HuH6P9DD0zj/llaps6TXLM9HyacLBRwmOLZmr+pHBsPopUnQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.2" - -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" - -web3-core@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.4.0.tgz#db830ed9fa9cca37479c501f0e5bc4201493b46b" - integrity sha512-VRNMNqwzvPeKIet2l9BMApPHoUv0UqwaZH0lZJhG2RBko42w9Xls+pQwfVNSV16j04t/ehm1aLRV2Sx6lzVfRg== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.4.0" - web3-core-method "1.4.0" - web3-core-requestmanager "1.4.0" - web3-utils "1.4.0" - -web3-core@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.0.tgz#46c09283bcfe197df0c543dbe751650cea157a7f" - integrity sha512-1o/etaPSK8tFOWTA6df3t9J6ez4epeyzlNmyh/gx8uHasfa16XLKD8//A9T+O/TmvyQAaA4hWAsQcvlRcuaZ8Q== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-core-requestmanager "1.5.0" - web3-utils "1.5.0" - -web3-core@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.2.tgz#ca2b9b1ed3cf84d48b31c9bb91f7628f97cfdcd5" - integrity sha512-sebMpQbg3kbh3vHUbHrlKGKOxDWqjgt8KatmTBsTAWj/HwWYVDzeX+2Q84+swNYsm2DrTBVFlqTErFUwPBvyaA== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.2" - web3-core-method "1.5.2" - web3-core-requestmanager "1.5.2" - web3-utils "1.5.2" - -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-abi@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.4.0.tgz#83f9f0ce48fd6d6b233a30a33bd674b3518e472b" - integrity sha512-FtmWipG/dSSkTGFb72JCwky7Jd0PIvd0kGTInWQwIEZlw5qMOYl61WZ9gwfojFHvHF6q1eKncerQr+MRXHO6zg== - dependencies: - "@ethersproject/abi" "5.0.7" - underscore "1.12.1" - web3-utils "1.4.0" - -web3-eth-abi@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.0.tgz#10a4bf11ec2302c6cf313b5de4e2e12d9620d648" - integrity sha512-rfT/SvfZY9+SNJRzTHxLFaebQRBhS67tGqUqLxlyy6EsAcEmIs/g4mAUH5atYwPE9bOQeiVoLKLbwJEBIcw86w== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.0" - -web3-eth-abi@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.2.tgz#b627eada967f39ae4657ddd61b693cb00d55cb29" - integrity sha512-P3bJbDR5wib4kWGfVeBKBVi27T+AiHy4EJxYM6SMNbpm3DboLDdisu9YBd6INMs8rzxgnprBbGmmyn4jKIDKAA== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.2" - -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-accounts@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.4.0.tgz#25fc4b2b582a16b77c1492f27f58c59481156068" - integrity sha512-tETHBvfO3Z7BXZ7HJIwuX7ol6lPefP55X7b4IiX82C1PujHwsxENY7c/3wyxzqKoDyH6zfyEQo17yhxkhsM1oA== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - underscore "1.12.1" - uuid "3.3.2" - web3-core "1.4.0" - web3-core-helpers "1.4.0" - web3-core-method "1.4.0" - web3-utils "1.4.0" - -web3-eth-accounts@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.0.tgz#1a71e12758440884450f4939290569ff82976cc3" - integrity sha512-tqvF2bKECaS6jDux8h1dkdsrfb5SHIVVA6hu2lJmZNlTBqFIq2A8rfOkqcanie6Vh5n5U7Dnc2LUoN9rxgaSSg== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.5.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-utils "1.5.0" - -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.4.0.tgz#604187d1e44365fa0c0592e61ac5a1b5fd7c2eaa" - integrity sha512-GfIhOzfp/ZXKd+1tFEH3ePq0DEsvq9XO5tOsI0REDtEYUj2GNxO5e/x/Fhekk7iLZ7xAqSzDMweFruDQ1fxn0A== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.12.1" - web3-core "1.4.0" - web3-core-helpers "1.4.0" - web3-core-method "1.4.0" - web3-core-promievent "1.4.0" - web3-core-subscriptions "1.4.0" - web3-eth-abi "1.4.0" - web3-utils "1.4.0" - -web3-eth-contract@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.0.tgz#f584a083316424110af95c3ad00c1c3a8a1796d2" - integrity sha512-v4laiJRzdcoDwvqaMCzJH1BUosbTVsd01Qp+9v05Q94KycjkdeahPRXX6PEcUNW/ZF8N006iExUweGjajTZnTA== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-core-promievent "1.5.0" - web3-core-subscriptions "1.5.0" - web3-eth-abi "1.5.0" - web3-utils "1.5.0" - -web3-eth-contract@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.2.tgz#ffbd799fd01e36596aaadefba323e24a98a23c2f" - integrity sha512-4B8X/IPFxZCTmtENpdWXtyw5fskf2muyc3Jm5brBQRb4H3lVh1/ZyQy7vOIkdphyaXu4m8hBLHzeyKkd37mOUg== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.2" - web3-core-helpers "1.5.2" - web3-core-method "1.5.2" - web3-core-promievent "1.5.2" - web3-core-subscriptions "1.5.2" - web3-eth-abi "1.5.2" - web3-utils "1.5.2" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.4.0.tgz#4e66dfc3bdc6439553482972ffb2a181f1c12cbc" - integrity sha512-jR1KorjU1erpYFpFzsMXAWZnHhqUqWPBq/4+BGVj7/pJ43+A3mrE1eB0zl91Dwc1RTNwOhB02iOj1c9OlpGr3g== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.12.1" - web3-core "1.4.0" - web3-core-helpers "1.4.0" - web3-core-promievent "1.4.0" - web3-eth-abi "1.4.0" - web3-eth-contract "1.4.0" - web3-utils "1.4.0" - -web3-eth-ens@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.0.tgz#f92ce19a541e42a0da4b8b04f7161d7a20ad3e86" - integrity sha512-NiaGfOnsCqP+3hOCeP3Q9IrlV/1ZCDiv8VmN1yF5Ya6n6YeO4TJU9MKP8i5038RFETjLIfGtXr5fthbsob30hA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.5.0" - web3-core-helpers "1.5.0" - web3-core-promievent "1.5.0" - web3-eth-abi "1.5.0" - web3-eth-contract "1.5.0" - web3-utils "1.5.0" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-iban@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.4.0.tgz#b54902c019d677b6356d838b3e964f925017c143" - integrity sha512-YNx748VzwiBe0gvtZjvU9BQsooZ9s9sAlmiDWJOMcvMbUTDhC7SvxA7vV/vrnOxL6oGHRh0U/azsYNxxlKiTBw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.4.0" - -web3-eth-iban@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.0.tgz#8c3a1aa7aeed4080ba7d077612ce17025eb0d67d" - integrity sha512-cFfiPA8xs4lemMJjDb9KfXzPvs6rBrRl8y4rgvh/JWlZZgKolzo7KLXq4NR3oFd/C81s0Lslvz2st1EREp5CNA== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.0" - -web3-eth-iban@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.2.tgz#f390ad244ef8a6c94de7c58736b0b80a484abc8e" - integrity sha512-C04YDXuSG/aDwOHSX+HySBGb0KraiAVt+/l1Mw7y/fCUrKC/K0yYzMYqY/uYOcvLtepBPsC4ZfUYWUBZ2PO8Vg== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.2" - -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth-personal@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.4.0.tgz#77420d1f49e36f8c461a61aeabac16045d8592c0" - integrity sha512-8Ip6xZ8plmWqAD4ESbKUIPVV9gfTAFFm0ff1FQIw9I9kYvFlBIPzukvm852w2SftGem+/iRH+2+2mK7HvuKXZQ== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.4.0" - web3-core-helpers "1.4.0" - web3-core-method "1.4.0" - web3-net "1.4.0" - web3-utils "1.4.0" - -web3-eth-personal@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.0.tgz#79e604f38439fbb7a9d4dcb20094359d20d3d388" - integrity sha512-FYBrzMS6q/df8ud1kAN1p6lqdP/pd0szogcuyrVyi++bFQiovnR+QosudFsbn/aAZPDHOEh0UV4P3KVKbLqw9g== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.5.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-net "1.5.0" - web3-utils "1.5.0" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.4.0.tgz#6ca2dcbd72d128a225ada1fec0d1e751f8df5200" - integrity sha512-L990eMJeWh4h/Z3M8MJb9HrKq8tqvzdGZ7igdzd6Ba3B/VKgGFAJ/4XIqtLwAJ1Wg5Cj8my60tYY+34c2cLefw== - dependencies: - underscore "1.12.1" - web3-core "1.4.0" - web3-core-helpers "1.4.0" - web3-core-method "1.4.0" - web3-core-subscriptions "1.4.0" - web3-eth-abi "1.4.0" - web3-eth-accounts "1.4.0" - web3-eth-contract "1.4.0" - web3-eth-ens "1.4.0" - web3-eth-iban "1.4.0" - web3-eth-personal "1.4.0" - web3-net "1.4.0" - web3-utils "1.4.0" - -web3-eth@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.0.tgz#819466117dfdc191095d6feb58b24023e016cb20" - integrity sha512-31ni3YliTDYLKuWt8naitZ4Ru86whZlqvz6kFzCaBaCR/EumzA9ejzNbcX9okio9zUtKSHH37Bk0+WogfU9Jqg== - dependencies: - web3-core "1.5.0" - web3-core-helpers "1.5.0" - web3-core-method "1.5.0" - web3-core-subscriptions "1.5.0" - web3-eth-abi "1.5.0" - web3-eth-accounts "1.5.0" - web3-eth-contract "1.5.0" - web3-eth-ens "1.5.0" - web3-eth-iban "1.5.0" - web3-eth-personal "1.5.0" - web3-net "1.5.0" - web3-utils "1.5.0" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-net@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.4.0.tgz#eaea1562dc96ddde6f14e823d2b94886091d2049" - integrity sha512-41WkKobL+KnKC0CY0RZ1KhMMyR/hMFGlbHZQac4KtB7ro1UdXeK+RiYX+GzSr1h7j9Dj+dQZqyBs70cxmL9cPQ== - dependencies: - web3-core "1.4.0" - web3-core-method "1.4.0" - web3-utils "1.4.0" - -web3-net@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.0.tgz#21ccbe7af3c3065633086b1e82ef100d833944b4" - integrity sha512-oGgEtO2fRtJjAp0K1/fvH247MeeDemFL+5tF+PxII9b/gBxnVe+MzP+oNLr4dTrweromjv34tioR3kUgsqwCWg== - dependencies: - web3-core "1.5.0" - web3-core-method "1.5.0" - web3-utils "1.5.0" - -web3-provider-engine@14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" - integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-provider-engine@15.0.4: - version "15.0.4" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz#5c336bcad2274dff5218bc8db003fa4e9e464c24" - integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-errors "^1.0.1" - eth-json-rpc-filters "^4.1.1" - eth-json-rpc-infura "^4.0.1" - eth-json-rpc-middleware "^4.1.5" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-provider-engine@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz#2600a39ede364cdc0a1fc773bf40a94f2177e605" - integrity sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-filters "^4.2.1" - eth-json-rpc-infura "^5.1.0" - eth-json-rpc-middleware "^6.0.0" - eth-rpc-errors "^3.0.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-provider-engine@^15.0.4: - version "15.0.12" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.12.tgz#24d7f2f6fb6de856824c7306291018c4fc543ac3" - integrity sha512-/OfhQalKPND1iB5ggvGuYF0+SIb2Qj5OFTrT2VrZWP79UhMTdP7T+L2FtblmRdCeOetoAzZHdBaIwLOZsmIX+w== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-errors "^2.0.2" - eth-json-rpc-filters "^4.1.1" - eth-json-rpc-infura "^4.0.1" - eth-json-rpc-middleware "^4.1.5" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" - -web3-providers-http@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.4.0.tgz#2d67f85fda00765c1402aede3d7e6cbacaa3091b" - integrity sha512-A9nLF4XGZfDb1KYYuKRwHY1H90Ee/0I0CqQQEELI0yuY9eca50qdCHEg3sJhvqBIG44JCm83amOGxR8wi+76tQ== - dependencies: - web3-core-helpers "1.4.0" - xhr2-cookies "1.1.0" - -web3-providers-http@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.0.tgz#47297ac0f058e1c9af7a1528d1dfc2a67d602e93" - integrity sha512-y1RuxsCGrWdsIUyuZBEN+3F8trl3bDZNajwLS2KYBGlB99sWYZHPmvbAsBpaW1d/I12W0fQiWOVzp63L7KPTow== - dependencies: - web3-core-helpers "1.5.0" - xhr2-cookies "1.1.0" - -web3-providers-http@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.2.tgz#94f95fe5572ca54aa2c2ffd42c63956436c9eb0a" - integrity sha512-dUNFJc9IMYDLZnkoQX3H4ZjvHjGO6VRVCqrBrdh84wPX/0da9dOA7DwIWnG0Gv3n9ybWwu5JHQxK4MNQ444lyA== - dependencies: - web3-core-helpers "1.5.2" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ipc@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.4.0.tgz#cd14e93e2d22689a26587dd2d2101e575d1e2924" - integrity sha512-ul/tSNUI5anhdBGBV+FWFH9EJgO73/G21haFDEXvTnSJQa9/byj401H/E2Xd8BXGk+2XB+CCGLZBiuAjhhhtTA== - dependencies: - oboe "2.1.5" - underscore "1.12.1" - web3-core-helpers "1.4.0" - -web3-providers-ipc@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.0.tgz#69d9b3a23f6bfd52f649f3bfbfa6696b159fa80a" - integrity sha512-Hda9wlOaIJC9/qMOVkayK+fbBHDZBmPcoL7TfjQX7hrtZn8V3+gR27ciyRXmuW7QD3hDg7CJfe5uRK8brh3nSA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.0" - -web3-providers-ipc@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.2.tgz#68a516883c998eeddf60df4cead77baca4fb4aaa" - integrity sha512-SJC4Sivt4g9LHKlRy7cs1jkJgp7bjrQeUndE6BKs0zNALKguxu6QYnzbmuHCTFW85GfMDjhvi24jyyZHMnBNXQ== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.2" - -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-providers-ws@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.4.0.tgz#a4db03fc865a73db62bc15c5da37f930517cfe08" - integrity sha512-E5XfF58RLXuCtGiMSXxXEtjceCfPli+I4MDYCKx/J/bDJ6qvLUM2OnnGEmE7pq1Z03h0xh1ZezaB/qoweK3ZIQ== - dependencies: - eventemitter3 "4.0.4" - underscore "1.12.1" - web3-core-helpers "1.4.0" - websocket "^1.0.32" - -web3-providers-ws@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.0.tgz#c78253af17dfdcd4f8a4c3a8ac1a684a73886ae7" - integrity sha512-TCwOhu5WbuQCSUoar+U+7N1NqI4A6MlcdZqsC7AhTogYYtnXOPRWfiHMZtUP7Qw50GKJ37FIH3YDItcHTNHd6A== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.0" - websocket "^1.0.32" - -web3-providers-ws@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.2.tgz#d336a93ed608b40cdcadfadd1f1bc8d32ea046e0" - integrity sha512-xy9RGlyO8MbJDuKv2vAMDkg+en+OvXG0CGTCM2BTl6l1vIdHpCa+6A/9KV2rK8aU9OBZ7/Pf+Y19517kHVl9RA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.2" - websocket "^1.0.32" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" - -web3-shh@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.4.0.tgz#d22ff8dce16987bef73172191d9e95c3ccf0aa80" - integrity sha512-OZMkMgo+VZnu1ErhIFXW+5ExnPKQg9v8/2DHGVtNEwuC5OHYuAEF5U7MQgbxYJYwbRmxQCt/hA3VwKjnkbmSAA== - dependencies: - web3-core "1.4.0" - web3-core-method "1.4.0" - web3-core-subscriptions "1.4.0" - web3-net "1.4.0" - -web3-shh@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.0.tgz#eabf7c346605b107f51dfe5e6df9643a4b5eb7aa" - integrity sha512-TwpcxXNh+fBnyRcCPPqVqaCB4IjSpVL2/5OR2WwCnZwejs1ife+pej8DYVZWm0m1tSzIDRTdNbsJf/DN0cAxYQ== - dependencies: - web3-core "1.5.0" - web3-core-method "1.5.0" - web3-core-subscriptions "1.5.0" - web3-net "1.5.0" - -web3-utils@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" - integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.4.0, web3-utils@^1.0.0-beta.31: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.4.0.tgz#e8cb381c81b242dc1d4ecb397200356d404410e6" - integrity sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.12.1" - utf8 "3.0.0" - -web3-utils@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.0.tgz#48c8ba0d95694e73b9a6d473d955880cd4758e4a" - integrity sha512-hNyw7Oxi6TM3ivXmv4hK5Cvyi9ML3UoKtcCYvLF9woPWh5v2dwCCVO1U3Iq5HHK7Dqq28t1d4CxWHqUfOfAkgg== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.5.2, web3-utils@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.2.tgz#150982dcb1918ffc54eba87528e28f009ebc03aa" - integrity sha512-quTtTeQJHYSxAwIBOCGEcQtqdVcFWX6mCFNoqnp+mRbq+Hxbs8CGgO/6oqfBx4OvxIOfCpgJWYVHswRXnbEu9Q== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - -web3@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.4.0.tgz#717c01723226daebab9274be5cb56644de860688" - integrity sha512-faT3pIX+1tuo+wqmUFQPe10MUGaB1UvRYxw9dmVJFLxaRAIfXErSilOf3jFhSwKbbPNkwG0bTiudCLN9JgeS7A== - dependencies: - web3-bzz "1.4.0" - web3-core "1.4.0" - web3-eth "1.4.0" - web3-eth-personal "1.4.0" - web3-net "1.4.0" - web3-shh "1.4.0" - web3-utils "1.4.0" - -web3@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.0.tgz#2c1d8c910ce9c8c33ca4e5a130c02eda9c0f82bf" - integrity sha512-p6mOU+t11tV5Z0W9ISO2ReZlbB1ICp755ogl3OXOWZ+/oWy12wwnIva+z+ypsZc3P8gaoGaTvEwSfXM9NF164w== - dependencies: - web3-bzz "1.5.0" - web3-core "1.5.0" - web3-eth "1.5.0" - web3-eth-personal "1.5.0" - web3-net "1.5.0" - web3-shh "1.5.0" - web3-utils "1.5.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -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== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" - spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-manifest-plugin@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" - integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== - dependencies: - fs-extra "^7.0.0" - lodash ">=3.5 <5" - object.entries "^1.1.0" - tapable "^1.0.0" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.44.2: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -webpack@^3.0.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" - integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" - -webrtc-adapter@^6.4.3: - version "6.4.8" - resolved "https://registry.yarnpkg.com/webrtc-adapter/-/webrtc-adapter-6.4.8.tgz#eeca3f0d5b40c0e629b865ef2a936a0b658274de" - integrity sha512-YM8yl545c/JhYcjGHgaCoA7jRK/KZuMwEDFeP2AcP0Auv5awEd+gZE0hXy9z7Ed3p9HvAXp8jdbe+4ESb1zxAw== - dependencies: - rtcpeerconnection-shim "^1.2.14" - sdp "^2.9.0" - -webrtc-adapter@^7.2.1: - version "7.7.1" - resolved "https://registry.yarnpkg.com/webrtc-adapter/-/webrtc-adapter-7.7.1.tgz#b2c227a6144983b35057df67bd984a7d4bfd17f1" - integrity sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A== - dependencies: - rtcpeerconnection-shim "^1.2.15" - sdp "^2.12.0" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -websocket-stream@^5.5.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.5.2.tgz#49d87083d96839f0648f5513bbddd581f496b8a2" - integrity sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ== - dependencies: - duplexify "^3.5.1" - inherits "^2.0.1" - readable-stream "^2.3.3" - safe-buffer "^5.1.2" - ws "^3.2.0" - xtend "^4.0.0" - -websocket@1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -websocket@^1.0.31, websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - -whatwg-fetch@^3.4.1, whatwg-fetch@^3.5.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -whatwg-mimetype@^2.3.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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - -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-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - -which-typed-array@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" - integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - -which@1.3.1, which@^1.2.9, which@^1.3.1: - 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.0, which@^2.0.1, which@^2.0.2: - 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" - -wide-align@1.1.3, wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wif@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" - integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= - dependencies: - bs58check "<3.0.0" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= - -word-wrap@^1.2.3, 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== - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -workbox-background-sync@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" - integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== - dependencies: - workbox-core "^5.1.4" - -workbox-broadcast-update@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" - integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== - dependencies: - workbox-core "^5.1.4" - -workbox-build@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" - integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== - dependencies: - "@babel/core" "^7.8.4" - "@babel/preset-env" "^7.8.4" - "@babel/runtime" "^7.8.4" - "@hapi/joi" "^15.1.0" - "@rollup/plugin-node-resolve" "^7.1.1" - "@rollup/plugin-replace" "^2.3.1" - "@surma/rollup-plugin-off-main-thread" "^1.1.1" - common-tags "^1.8.0" - fast-json-stable-stringify "^2.1.0" - fs-extra "^8.1.0" - glob "^7.1.6" - lodash.template "^4.5.0" - pretty-bytes "^5.3.0" - rollup "^1.31.1" - rollup-plugin-babel "^4.3.3" - rollup-plugin-terser "^5.3.1" - source-map "^0.7.3" - source-map-url "^0.4.0" - stringify-object "^3.3.0" - strip-comments "^1.0.2" - tempy "^0.3.0" - upath "^1.2.0" - workbox-background-sync "^5.1.4" - workbox-broadcast-update "^5.1.4" - workbox-cacheable-response "^5.1.4" - workbox-core "^5.1.4" - workbox-expiration "^5.1.4" - workbox-google-analytics "^5.1.4" - workbox-navigation-preload "^5.1.4" - workbox-precaching "^5.1.4" - workbox-range-requests "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" - workbox-streams "^5.1.4" - workbox-sw "^5.1.4" - workbox-window "^5.1.4" - -workbox-cacheable-response@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" - integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== - dependencies: - workbox-core "^5.1.4" - -workbox-core@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" - integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== - -workbox-expiration@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" - integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== - dependencies: - workbox-core "^5.1.4" - -workbox-google-analytics@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" - integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== - dependencies: - workbox-background-sync "^5.1.4" - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" - -workbox-navigation-preload@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" - integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== - dependencies: - workbox-core "^5.1.4" - -workbox-precaching@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" - integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== - dependencies: - workbox-core "^5.1.4" - -workbox-range-requests@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" - integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== - dependencies: - workbox-core "^5.1.4" - -workbox-routing@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" - integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== - dependencies: - workbox-core "^5.1.4" - -workbox-strategies@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" - integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== - dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - -workbox-streams@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" - integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== - dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - -workbox-sw@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" - integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== - -workbox-webpack-plugin@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" - integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== - dependencies: - "@babel/runtime" "^7.5.5" - fast-json-stable-stringify "^2.0.0" - source-map-url "^0.4.0" - upath "^1.1.2" - webpack-sources "^1.3.0" - workbox-build "^5.1.4" - -workbox-window@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" - integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== - dependencies: - workbox-core "^5.1.4" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== - dependencies: - microevent.ts "~0.1.1" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -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" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.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@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -wrtc@^0.4.6: - version "0.4.7" - resolved "https://registry.yarnpkg.com/wrtc/-/wrtc-0.4.7.tgz#c61530cd662713e50bffe64b7a78673ce070426c" - integrity sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g== - dependencies: - node-pre-gyp "^0.13.0" - optionalDependencies: - domexception "^1.0.1" - -ws@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" - integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== - -ws@7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== - -ws@7.4.6, ws@~7.4.2: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@7.5.3, ws@^7.4.5, ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - -ws@^3.0.0, ws@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^5.1.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.0.0, ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7.5.3: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xmlhttprequest-ssl@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= - -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -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== - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.5.1, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@13.1.2, yargs-parser@^13.1.0, 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-parser@^10.0.0: - 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@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - 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.0" - -yargs@13.3.2, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: - 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" - -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.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 "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==