From ef1df354e547db775feb8ccdd46e4babbf63babe Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Thu, 12 Aug 2021 21:33:17 +0400 Subject: [PATCH] Initial Release ON Production (#457) * update workflows * update workflow * fix hardhat-deploy (#312) * fix hardhat-deploy * update hardhat-deploy Co-authored-by: Giorgi-Lagidze * Fix Govern queue test issue (#313) * fix test failure if event arguments are structs * fix test failure due to missing event abi * update comment to explain the reason behind chai overwrite * fix unlocked event test case * EOF error fix Co-authored-by: Giorgi-Lagidze * add paths to github action workflow (#314) * add path filtering on the workflows * dummy test workflow * add dummy test file to trigger the test cd * remove dummy test workflow and file * update subgraph * replace govern-console with new console * update packages and gitignore * add public in gitignore * remove .DS_Store * Feature/remove govern console (#316) * replace govern-console with new console * update packages and gitignore * add public in gitignore * remove .DS_Store Co-authored-by: Giorgi-Lagidze * change babel-loader version * add storybook-static in gitignore * Feature/fleek (#319) * add rinkeby fleek * update console's workflow * update console workflow * update govern-console * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * update fleek * Feature/proposaldetails (#324) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi * Dao queries based on new subgraph definition (#318) * Dao queries based on new subgraph definition * update govern workflow * fix eof Co-authored-by: Giorgi Lagidze * Fix/gas dos (#310) * gas dos fix on queue * change erc3000 * max calldatasize for govern-queue schedule * max calldatasize for govern-queue * change verification config * increase executionDelay * add collateral checks * increase executionDelay for dummyconfig * change parameters for govern base factory * update govern subgraph * update govern base factory * update subgraph * verify fix governbase * update rinkeby subgraph Co-authored-by: Giorgi-Lagidze * create default erc3000 config data (#326) * GovernRegistry and GovernBaseFactory addresses in README.md for the Rinkeby testnet updated (#329) * give root role to govern (#330) * give root role to govern * update root rule for queue * freeze root role * fix EOF * update fleek rinkeby for console * update workflow and fleek * update workflow * trigger workflow * update workflow * update workflow * update workflow to include CI warnings * trigger workflow path * Govern integration (#331) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url * create esm and umd bundles * add example using createDao for web * updated doc for createDao * fix merge with develop error * add proposal scheduling - TODO fix test with bad config * [WIP] chore: newGover implementation in ts library * fix test failure with schedule proposal * chore: refactor of new govern finished with green tests * WIP: add challenge, veto, resolve, execute proposal.. test still failing. * fix: rollup json added * update govern queue abi * scree 1 and 2 in progress * fix merge issue * schedule proposal with a resolver * screen 3 in progress * essential UI for all 4 screen * clean up * set nonce in schedule * Added Wallet and Proposal Details page. * new proposal button * create dao references used for input fields and checkboxes * make proposal nonce nullable * input field value missed * chore: removed governBaseFactory abi json * Corrected input fields * chore: entirely removed abis from govern package * fix: remove json plugin from umdconfig in rollup * chore: register abi json converted to human readable * challenge works now, but, resolve still fail with DM_INVALID_ADJUDICATION_STATE error * exclude files from jest test coverage * skip challenge test as its now failing with CLK_TOO_MANY_TRANSITIONS * add alchemy archive node * run more tests * fix depcheck error - ethers missing * grant veto power to test user to do veto test - unable to grant veto power * Changed Routing, New Proposal testing in progress * Added govern package with yarn link. Corrected variable name * Updated data to session storage * Working test proposal creation * Govern: fix veto test * bring back test command * fix resolve test failure * Added HashRouter and now storing values in session storage, Added Challenge Proposal Integration WIP * New Proposal Flow. * grid css fix * Added - DAO config fetch * Added extra data pull for challenge proposal * checkbox component * blueswitch component * blue porgressbar component * cleaning up create-dao views impelemnting new components * Added execute proposal function WIP * Removed debuggers * Footer added and lint fixes Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Yuet Loo Wong Co-authored-by: cbrzn Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: Giorgi Lagidze * change token amount to BigNumberish (#332) * build and install govern in workflow * Govern integration (#333) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url * create esm and umd bundles * add example using createDao for web * updated doc for createDao * fix merge with develop error * add proposal scheduling - TODO fix test with bad config * [WIP] chore: newGover implementation in ts library * fix test failure with schedule proposal * chore: refactor of new govern finished with green tests * WIP: add challenge, veto, resolve, execute proposal.. test still failing. * fix: rollup json added * update govern queue abi * scree 1 and 2 in progress * fix merge issue * schedule proposal with a resolver * screen 3 in progress * essential UI for all 4 screen * clean up * set nonce in schedule * Added Wallet and Proposal Details page. * new proposal button * create dao references used for input fields and checkboxes * make proposal nonce nullable * input field value missed * chore: removed governBaseFactory abi json * Corrected input fields * chore: entirely removed abis from govern package * fix: remove json plugin from umdconfig in rollup * chore: register abi json converted to human readable * challenge works now, but, resolve still fail with DM_INVALID_ADJUDICATION_STATE error * exclude files from jest test coverage * skip challenge test as its now failing with CLK_TOO_MANY_TRANSITIONS * add alchemy archive node * run more tests * fix depcheck error - ethers missing * grant veto power to test user to do veto test - unable to grant veto power * Changed Routing, New Proposal testing in progress * Added govern package with yarn link. Corrected variable name * Updated data to session storage * Working test proposal creation * Govern: fix veto test * bring back test command * fix resolve test failure * Added HashRouter and now storing values in session storage, Added Challenge Proposal Integration WIP * New Proposal Flow. * grid css fix * Added - DAO config fetch * Added extra data pull for challenge proposal * checkbox component * blueswitch component * blue porgressbar component * cleaning up create-dao views impelemnting new components * Added execute proposal function WIP * Removed debuggers * Footer added and lint fixes * grid fix for the console page * proposals page fix and load more button fixes to * Dao Main page grd fix * wallet connection handling Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Yuet Loo Wong Co-authored-by: cbrzn Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: Giorgi Lagidze * Header Title Fixed and Button added for Create DAO (#334) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url * create esm and umd bundles * add example using createDao for web * updated doc for createDao * fix merge with develop error * add proposal scheduling - TODO fix test with bad config * [WIP] chore: newGover implementation in ts library * fix test failure with schedule proposal * chore: refactor of new govern finished with green tests * WIP: add challenge, veto, resolve, execute proposal.. test still failing. * fix: rollup json added * update govern queue abi * scree 1 and 2 in progress * fix merge issue * schedule proposal with a resolver * screen 3 in progress * essential UI for all 4 screen * clean up * set nonce in schedule * Added Wallet and Proposal Details page. * new proposal button * create dao references used for input fields and checkboxes * make proposal nonce nullable * input field value missed * chore: removed governBaseFactory abi json * Corrected input fields * chore: entirely removed abis from govern package * fix: remove json plugin from umdconfig in rollup * chore: register abi json converted to human readable * challenge works now, but, resolve still fail with DM_INVALID_ADJUDICATION_STATE error * exclude files from jest test coverage * skip challenge test as its now failing with CLK_TOO_MANY_TRANSITIONS * add alchemy archive node * run more tests * fix depcheck error - ethers missing * grant veto power to test user to do veto test - unable to grant veto power * Changed Routing, New Proposal testing in progress * Added govern package with yarn link. Corrected variable name * Updated data to session storage * Working test proposal creation * Govern: fix veto test * bring back test command * fix resolve test failure * Added HashRouter and now storing values in session storage, Added Challenge Proposal Integration WIP * New Proposal Flow. * grid css fix * Added - DAO config fetch * Added extra data pull for challenge proposal * checkbox component * blueswitch component * blue porgressbar component * cleaning up create-dao views impelemnting new components * Added execute proposal function WIP * Removed debuggers * Footer added and lint fixes * grid fix for the console page * proposals page fix and load more button fixes to * Dao Main page grd fix * wallet connection handling * Govern Console Name and Icon change, create Dao added to the top Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Yuet Loo Wong Co-authored-by: cbrzn Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: Giorgi Lagidze * Feature/dao 151 integrate challenge execute and veto (#335) * Added WIP for Challenge, Completed integration of Schedule * Fix bugs Co-authored-by: bhanusanghi * Feature/dao 127 dao creation (#336) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url * create esm and umd bundles * add example using createDao for web * updated doc for createDao * fix merge with develop error * add proposal scheduling - TODO fix test with bad config * [WIP] chore: newGover implementation in ts library * fix test failure with schedule proposal * chore: refactor of new govern finished with green tests * WIP: add challenge, veto, resolve, execute proposal.. test still failing. * fix: rollup json added * update govern queue abi * scree 1 and 2 in progress * fix merge issue * schedule proposal with a resolver * screen 3 in progress * essential UI for all 4 screen * clean up * set nonce in schedule * Added Wallet and Proposal Details page. * new proposal button * create dao references used for input fields and checkboxes * make proposal nonce nullable * input field value missed * chore: removed governBaseFactory abi json * Corrected input fields * chore: entirely removed abis from govern package * fix: remove json plugin from umdconfig in rollup * chore: register abi json converted to human readable * challenge works now, but, resolve still fail with DM_INVALID_ADJUDICATION_STATE error * exclude files from jest test coverage * skip challenge test as its now failing with CLK_TOO_MANY_TRANSITIONS * add alchemy archive node * run more tests * fix depcheck error - ethers missing * grant veto power to test user to do veto test - unable to grant veto power * Changed Routing, New Proposal testing in progress * Added govern package with yarn link. Corrected variable name * Updated data to session storage * Working test proposal creation * integration functions * handle creating new token * fix: extra line removed * correcting gradient in progressbar * essencial integration complete * custom paper component * circular progress component * adding comments * integrate Create Dao UI with govern package * trying to add missing sessionStorage Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Yuet Loo Wong Co-authored-by: Vamsi Reddy Co-authored-by: cbrzn Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: c0rv0s * limit increased for prposals (#337) * Feature/dao 184 dao setting views (#339) * subgraph queries for console * add proposal button checks * eslint rearrange * prepare dao setting ui * configure functionality * session storage dependency removed from all pages * Dao main page handled with non existant data Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: Vamsi * Feature/dao 127 dao creation (#340) * Added basic injected wallet and added Subgraph queries for DAOs * Added all subgraph data for daos * Footer in progress * Corrected subgraph query * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * Added subgraph for fetching proposals and for fetching proposal details * Feature/new proposal flow (#322) * added public folder togitignore * Proposal Flow * few typescript type fixes and routing fix, an id param cannot be passed directly as the first route * Updated correct url change * Corrected url * create esm and umd bundles * add example using createDao for web * updated doc for createDao * fix merge with develop error * add proposal scheduling - TODO fix test with bad config * [WIP] chore: newGover implementation in ts library * fix test failure with schedule proposal * chore: refactor of new govern finished with green tests * WIP: add challenge, veto, resolve, execute proposal.. test still failing. * fix: rollup json added * update govern queue abi * scree 1 and 2 in progress * fix merge issue * schedule proposal with a resolver * screen 3 in progress * essential UI for all 4 screen * clean up * set nonce in schedule * Added Wallet and Proposal Details page. * new proposal button * create dao references used for input fields and checkboxes * make proposal nonce nullable * input field value missed * chore: removed governBaseFactory abi json * Corrected input fields * chore: entirely removed abis from govern package * fix: remove json plugin from umdconfig in rollup * chore: register abi json converted to human readable * challenge works now, but, resolve still fail with DM_INVALID_ADJUDICATION_STATE error * exclude files from jest test coverage * skip challenge test as its now failing with CLK_TOO_MANY_TRANSITIONS * add alchemy archive node * run more tests * fix depcheck error - ethers missing * grant veto power to test user to do veto test - unable to grant veto power * Changed Routing, New Proposal testing in progress * Added govern package with yarn link. Corrected variable name * Updated data to session storage * Working test proposal creation * integration functions * handle creating new token * fix: extra line removed * correcting gradient in progressbar * essencial integration complete * custom paper component * circular progress component * adding comments * integrate Create Dao UI with govern package * trying to add missing sessionStorage * adding aragon voice url * disable create new dao button when no wallet connected * adding validation to create dao Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Yuet Loo Wong Co-authored-by: Vamsi Reddy Co-authored-by: cbrzn Co-authored-by: Giorgi Lagidze Co-authored-by: c0rv0s * fix test failure with big numbers (#343) * add hardhat task to set ens address (#342) * add hardhat task to set ens address * add instruction on how to run the task * Feature/dao 167 add links to aragon voice and proxy (#341) * adding proxy url * fixing feature/dao-189-validate-create-form * big fix with validation * remove un necesary array push * Input Field fixes and uppercase added to input field Co-authored-by: Vamsi * Feature/dao 135 dao configuration UI (#344) * dao setting UI, config population in progress * Input Field fix and Dao Setting page fix * feature/dao-165-implement-frontend * input field width correction Co-authored-by: Vamsi * fix dao settings (#345) * New Proposal Page fixed and beautified (#346) * executor needs to be set before the effect is being returned. (#347) This will solve the ens name issue probably * Hot fix/executor undefined (#348) * executor needs to be set before the effect is being returned. * executor was not persisting on state change * registerToken in vocdoni (#349) * create dao with happy path testing, no global config option yet * add more test cases for createDao * add configuration option for dao factory address * renamed filename to follow convention * [WIP] feat: vocdoni integration * chore: trying to make register token test work * [WIP] chore: use geth for token registration in vocdoni * fix: typo on comment * fix: typo on comment * added vocdoni integration * upgrade dvote libraries to 1.2.0 * temporary disable typescript strict checking to build with dvote libs * fix hardhat config error * remove unused dependency * add EOF line * check before register token, register token without verified position Co-authored-by: cbrzn Co-authored-by: Giorgi Lagidze * Feature/dao 158 dialog for handling transactions to be (#352) * WIP - Working Transaction Keeper, enabled Storybook Relative Imports * Added WIP changes, removed ref from search dao box * Input field changed to work without refs * Added a few changes, removed debuggers * Removed yarn lock file Co-authored-by: Vamsi * Feature/move styled components (#353) * WIP - Working Transaction Keeper, enabled Storybook Relative Imports * Added WIP changes, removed ref from search dao box * Input field changed to work without refs * Added a few changes, removed debuggers * Moved all styled components outside component declaration * small bug fix * Feature/dao 238 issue about createdao (#351) * in progress * set default config by dao-161-add-create-dao-to-go * addressing problem 1 and 2 * add fixes * add fixes Co-authored-by: Giorgi Lagidze * Feature/dao 215 integrate with blockchain (#350) * setting ui integration with govern - inprogress * setting ui handle decimals and input hex - inprogress Co-authored-by: Giorgi Lagidze * add vocdoni dvote * Feature/transaction queue (#357) * refactoring createDao * merging input field refactoring changes into this branch for unified PR * refactoring DaoSetting * searchDaoName and if conditions changed to make it short * review dao seting in progress * refactoring the whole codebase * add setvalues for react-form-hook Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: Vamsi * Added changes for making grid responsive (#355) Co-authored-by: Giorgi Lagidze * DAO-194 - Added Dao not found page (#356) * Added page for no dao found. Added a numerous fixes for making header and footer positions workable * Bug Fix * Feature/dao search (#358) * Added page for no dao found. Added a numerous fixes for making header and footer positions workable * Bug Fix * Corrected regex bug * Feature/dao search (#361) * Added page for no dao found. Added a numerous fixes for making header and footer positions workable * Bug Fix * Corrected regex bug * Fixes for footer placement * Feature/new additions (#362) * set value fixed for forms * typescript amendments * adding fixes for the refactor (#363) * fix govern test failures (#360) * fix test failures * review comment: use utils.isAddress for consistency * packages update * fix error missing TransactionResponse Co-authored-by: Giorgi Lagidze * Feature/dao 248 script for mainnet ens setup (#359) * ens setup scripts * ens label description update * simplify getEthRegistrar * update favicon and header logo (#364) * add human readable amount message for approvals (#365) * fix id to lower case for daos (#369) * fix id to lower case for daos * daoname changed to lowercase inside the new Dao constructor * Feature/fallback provider (#367) * Added fallback provider, Changed name to augmneted wallet * removed debugs * Moved infura id to constants * Add from validation (#366) * refactoring create dao and adding validations * adding minimum validation to daoSettings * isAdress validation * fix typo * feature/dao-255-validation-type-number * add contract validation * temporary show success for repeating token register * clean up validation Co-authored-by: Giorgi Lagidze * add missing favicon files (#370) * Feature/dao 252 add link to dao settings (#368) * add link to dao settings * minor text formatting changes * Feature/dao 190 etherscan fetch for new action page (#371) * fetch abi from etherscan * add ens support for fetch abi, add form validation * pass fetch function to render fetch button * move fetch logic to new action dialog * handle token already registered (#372) * handle token already registered * convert rules and proof human readable in a proposal * remove unnecessary caption * correcting DAO not found page (#373) * decode proposal action data (#374) * Feature/dao 263 dao ready banner (#375) * fix multiple current config loads * set DAO ready banner * feature/dao-269-weird-footer-logo * fix sizes * Feature/widget proposals (#376) * fetch abi from etherscan * add ens support for fetch abi, add form validation * pass fetch function to render fetch button * move fetch logic to new action dialog * add proposal widgets into components * return empty from widget components * Added styling * Corrected Date Value. Multiplying qith 1000 to convert seconds to milliseconds * Added a function getFormatter value to either get back a string or a link if it a valid IPFS link * Added Field Component * add ipfs check * ipfs check * add createdAt order on daos * fix action data misalign Co-authored-by: Yuet Loo Wong Co-authored-by: Bhanu Sanghi * returns true if contract address is valid (#377) * fix states and colors (#379) * Feat/toast messages (#378) * Toast Messages and wallet connection fix * Enque Toasts, Apply validations on dao search, Searhcable Actions, New proposal Page validations shown through toast. * toast messages added * challenge reason check Co-authored-by: Giorgi Lagidze * add validation to newProposal (#380) * add validation to newProposal * clean up * missing dependency fix (#383) * missing dependency fix * removing extra messages * return undefined account if fallback provider is used * Css fixes (#385) * added css fixes and transaction modal end state * force refresh of proposal page (#382) * Feature/dao 264 execution scheduling modal (#381) * improve schedule proposal flow and redirect to proposal details page * increase execution time to avoid bad delay error when scheduling new proposals * cleanup warning messages * extract message from user cancelling transaction * added redirect option to transaction modal * added missing dependency * use onCompleteAllTransactions() to do redirect for proposal scheduling * fix EOF error * added transaction failure reason * remove unused references * revert back to 30 second latency * Feature/prettier fix (#384) * change prettier config and husky * fix govern symlink * update eslint disable * turn off eslint react scope and unescaped * clean up all warnings * feature/dao-296-storybook-building-error Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * do not show transaction modal if there's error (#386) * fix eslint error (#390) * fix css styling with proposal actions (#389) * Feature/dao 278 transaction modal improvements (#388) * added more details to error dialog and prevent modal closing clicking on backdrop * align transaction items by length * Feature/ipfs handling (#391) * ipfs upload * ipfsinput modification * clean up warnings * api hooks separately * clear AN button wanings * new changes * use conventional naming * update execution delay * button types Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * Feature/dao 290 display network status (#387) * network name, 2x image, challenge card in progress * remove challenge card component * prevent app break if subgraph is down * consider no subgraph in prposal detail and doa detail page * clean up * change node versions in workflows Co-authored-by: Giorgi Lagidze * Feature/dao 290 display network status (#392) * network name, 2x image, challenge card in progress * remove challenge card component * prevent app break if subgraph is down * consider no subgraph in prposal detail and doa detail page * clean up * change node versions in workflows * update node version Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * fix govern test failures (#393) * Feature/new changes (#394) * remove loading state from query * transaction modal optional functions * add ids in query * better way for pagination * remove console logs * remove search input (#397) * build container right before calling proposal.schedule() (#400) * Feature/refactoring 1 (#399) * redesign get token info functionality * redesign get token info functionality * fix loading query hook * fix mustache tag issue * add sample code to get title from ipfs * fix token retrivals + ipfs metadata handler * subgraph changes + ipfs + refactoring * fix errors * proof and rules separate loading * fix formatunits * dao query hook fixed * dao settings validations for amounts * add amount positive validations on dao settings * add buffer concat for ipfs content * flex-start for proposal card content Co-authored-by: Yuet Loo Wong * Testing aragon UI 2 (#401) * install aragon ui v2 * add aragon ui to home page * Create Dao Flow UI Implemtation * feature/dao-328-implement-frontend * cleanup and adding types * fix typo * Feature/dao 297 add polling in proposal detail (#402) * add polling to proposal query * prevent re-rendering * fix error: fewer hooks than expected * console environment (#404) * console environment * moved DAO config from constant to environment * remove obsolete code * connect to provider based on chainId * Feature/dao 391 proposal resolution (#403) * fix typo * render approved as string * Feature/dao 394 implement functionalities (#406) * update contract address in govern * set contract address in tests * start implement functionalities * add newGovern abi * restructure create dao flow * new changes per design and validations Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * add ipfs link to decoded action data (#405) * add ipfs link to decoded action data * fix initial ipfs loading state * concat buffers for ipfs data Co-authored-by: Giorgi Lagidze * Feature/dao 400 update dao setting page (#407) * merge with develop * update setting UI * Update Setting * add new ui components to create dao flow * replace ui component * search fix * update footer * clean up * SUBGRAPH: update ipfs cat fetching * fix title text (#408) * add daofactory in environments * rename create dao * Fix/create dao (#410) * fix create dao small issues * fix ipfs placeholder * Feature/dao 399 new execution flow (#409) * wip: new execution page * refactor, add delete/move up/down buttons * temporary commit with button update and action list move and remove functions * use react-hook-form to manage action list * rename proposals to executions * enable css prop in react element * add stepper component * disable warning of unused variable if variable name starts with underscore * add withdraw, mint and custom execution flow * make first part of address show 4 bytes, excluding 0x * refactor * add required validation rule * remove obsolete code * handle encoding error * cleanup and bug fix * support small layout * validate address field * small layout for action list buttons * fix issue with missing input field name * update aragon ui * remove contract selector form * fix error passing number instead of string for the columns property to Grid * Feature/contract changes (#396) * schedule acl list * fix schedule list when length 0 * add merkle root in govern create * schedule list fixed + test cases * govern base factory better tests * collaterals -- custom schedule/challenge tokens * fix collaterals for govern create * remove abi from gitignore * Govern Executor: add deposit * EOF + uncomment ens * remove eth deposited test * Feature/minter event (#412) * add minter in registry event * fix govern-core tests * fix createdao path * add withdraw (#413) * add withdraw * fix withdraw * Feature/dao 401 deposit asset action flow (#414) * wip: new execution page * refactor, add delete/move up/down buttons * temporary commit with button update and action list move and remove functions * use react-hook-form to manage action list * rename proposals to executions * enable css prop in react element * add stepper component * disable warning of unused variable if variable name starts with underscore * add withdraw, mint and custom execution flow * make first part of address show 4 bytes, excluding 0x * refactor * add required validation rule * remove obsolete code * handle encoding error * cleanup and bug fix * support small layout * validate address field * small layout for action list buttons * deposit form initial version * format signature according to design * add deposit transaction processing status dialog, bug fixes, refactoring * cleanup obsolete code * add minter to dao query * use GovernMinter's mint function * set mint context to 0x * Feature/dao 420 implement fileinput in console (#411) * implement fileInput * clean up * correct folder name typo * quick work arround for react form Co-authored-by: Giorgi Lagidze * small fixes (#415) * small fixes * uncomment tests * Feature/fixes (#417) * new bug fixes * add no-cache * remove queries cache-only * Feature/ara 828 create dao issue with file component (#419) * dont show text file as ipfs file * fix bugs * update ProposalCard * fixing fileInput design bad in small size * clean up warnings * add custom line height * add elipsis to propsal card * Weird text sizing * subgraph fixed * add cursor to ProposalCard Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * Console deposit + withdrawal (#418) * integrate with Govern Executor deposit function * integrate govern withdrawal * remove unused variables * subgraph fixed * handle long function name and argument list * add value field to payable actions * withdraw freeze when public * typo * bring back failuremap * remove nonce from proposaldetails * fix typescript error Co-authored-by: Giorgi Lagidze * Feature/dao 418 create help component for console (#420) * starting help component * adding image * add helpComponent to CreateDao and Setting * subgraph fixed * address list correction * correct parttern for pages * show correct view on progress Co-authored-by: Giorgi Lagidze * Feature/console deposit (#421) * integrate with Govern Executor deposit function * integrate govern withdrawal * remove unused variables * subgraph fixed * handle long function name and argument list * add value field to payable actions * withdraw freeze when public * typo * bring back failuremap * remove nonce from proposaldetails * fix typescript error * clean up duplicate getToken() Co-authored-by: yuetloo * Feature/dao 419 mobile menu (#423) * fix header for mobile * clean up * Show abi input only if contract is not verified. (#422) * fix warning * display abi field only if contract is not verified * show abi field if contract not verified * change header icon (#424) * change icon * move svg icons to the svgs subfolder * update icon (#425) * DAO-35: use aragon ui toast (#426) * replace snackbar with toast * replace ANButton with aragon ui Button * Bug fixing - DAO-32 (#427) * register token cycle correction * remove variant from toast * setting file upload bug fix * fix existing token in create dao bug * console log clean up * fix transaction keeper bug * parcial update transaction dialog ui * add text rule check * add getRule function * update texts * change logo * addressing comments * add beta label to header title (#428) * Feature/ipfs loader (#429) * subgraph fixed * ipfs loader for dao settings ruls * Feature/challenge bug (#430) * subgraph fixed * fix challenge bug if token addresses are the same * Minor Govern ui fixes DAO-40 (#432) * createDao button - only show icon in small view * change create dao button icon * transaction dialog bug fix * move progress to the top * update beta label * correct titles * Clean up * refinement * fix contentswitcher in ipfs * resolve-button (#431) * resolve-button * ipfs gateway link fixed * fix proposal card hash * DAO-52 remove story book (#434) * remove story book from ci job * remove story book * implement file size validation (#435) * remove memo from execute widget (#436) * Enable analytics on govern DAO-38 (#433) * implement analytic * remove warnings and errors * Feature/dao 55 (#437) * contract updates * update workflow * change .env keys * fix factory tests * new deployments (#438) * Wallet fix (#439) * fix wallet address undefined bug * clean up * DAO-63 fix tests (#440) * add missing await * fix test cases * check contract address * temporary exclude hardhat tests using forking as it's broken due to EIP1559 transactions * fix test failures thrown in hardhat getContractAt and getContractFactory * skip ens test * prevent hardhat from estimating gas on getContractAt and getContractFactory * update resolver for staging * Feature/dao 66 (#441) * dao identifer already exists * adding window.scroll * add connect wallet warning on review dao * implement scroll to id * import without relative path Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * Text copy DAO-64 (#442) * Landing page * copy fix * addressing review comments * revert token decimal message Co-authored-by: yuetloo * update dependencies (#443) * fix typo and uppercase * implement analytics event DAO-98 (#445) * implement analytic events * add nav bar event * in progress * add wallet disconnected event * use user account * implement disconnect * clean up * return excecutor from govern.js * return error message * correct naming convention * address comment * DAO-64 addressing comments (#444) * address comment, show title in collateral, remove useEffect in useForm * Feature/fix createdao bug (#447) * feature/fix-createdao-bug * cancel previouse subscriptions * address concern about change in registery address * only create new contract instance if registery address changed * correct typo * refactor govern register event * refactor govern registered event * clean up Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> * update govern bug with subgraphs (#448) * fix subgraph * fix subgraph error * update govern executor with subgraphs * update contracts + Subgraph * Bug / DAO-105 (#449) * update aragon ui and clear warnings * update aragon ui to fix contentSwitcher warning * back button integrated (#451) * DAO-77 - changing main agreement copy, helper text, and adding ReactNode and rows as optional props on IPFSInput (#450) * DAO-165 - adding aragon link to footer (#452) * add govern deployments * fix eslint * update resolver for mainnet * DAO-166: changing help texts and re-organising the component (#453) * update contract addresses * Fixing proposal title format for longer titles (#455) * Fixing DAOCard title ellipsis (#456) * Feature/govern deployments (#454) * add govern deployments * fix eslint * update resolver for mainnet * update contract addresses * fleek update Co-authored-by: Giorgi-Lagidze Co-authored-by: Yuet Wong Co-authored-by: Vamsi Reddy Co-authored-by: Bhanu Sanghi Co-authored-by: bhanusanghi Co-authored-by: Samuel Furter Co-authored-by: cbrzn Co-authored-by: Rekard0 <5880388+Rekard0@users.noreply.github.com> Co-authored-by: c0rv0s Co-authored-by: Ramon Canales --- .github/workflows/contracts-ci-cd.yml | 118 +- .github/workflows/govern-ci-cd.yml | 28 + .github/workflows/govern-console-ci-cd.yml | 124 + .github/workflows/server-ci-cd.yml | 50 +- .github/workflows/subgraph-ci-cd.yml | 90 +- .husky/_/husky.sh | 30 + .husky/pre-commit | 4 + README.md | 23 +- deployments/mainnet/evm-dev-preview.md | 4 +- deployments/rinkeby/evm-dev-preview.md | 4 +- docs/README.md | 9 +- docs/SUMMARY.md | 16 +- docs/developers/govern-js.md | 79 +- docs/developers/smart-contracts.md | 16 +- docs/guides/core-concepts.md | 5 +- docs/guides/erc3000.md | 3 +- package.json | 4 +- packages/erc3k/.solcover.js | 6 +- packages/erc3k/contracts/ERC3000Data.sol | 11 +- packages/erc3k/contracts/IERC3000Registry.sol | 4 +- packages/erc3k/test/erc3k-data.test.ts | 113 +- .../helpers.ts => erc3k/utils/ERC3000.ts} | 109 +- packages/govern-console/.babelrc | 4 + packages/govern-console/.eslintrc.js | 26 - packages/govern-console/.eslintrc.json | 35 + packages/govern-console/.gitignore | 8 +- .../{.prettierrc => .prettierrc.json} | 7 +- packages/govern-console/LICENSE | 21 + packages/govern-console/README.md | 48 +- packages/govern-console/config-overrides.js | 4 + packages/govern-console/decs.d.ts | 1 + .../govern-console/fleek/console.mainnet.json | 14 + .../govern-console/fleek/console.rinkeby.json | 14 + .../fleek/console.rinkeby.staging.json | 14 + packages/govern-console/overrides-mui.d.ts | 13 + packages/govern-console/package.json | 137 +- packages/govern-console/public/favicon.png | Bin 5488 -> 0 bytes packages/govern-console/public/index.html | 76 +- packages/govern-console/public/logo192.png | Bin 5347 -> 0 bytes packages/govern-console/public/logo512.png | Bin 9664 -> 0 bytes packages/govern-console/public/manifest.json | 28 +- .../public/media/android-chrome-192x192.png | Bin 0 -> 12210 bytes .../public/media/android-chrome-512x512.png | Bin 0 -> 85541 bytes .../public/media/apple-touch-icon.png | Bin 0 -> 11691 bytes .../public/media/browserconfig.xml | 9 + .../public/media/favicon-16x16.png | Bin 0 -> 1505 bytes .../public/media/favicon-32x32.png | Bin 0 -> 2016 bytes .../govern-console/public/media/favicon.ico | Bin 0 -> 15086 bytes .../public/media/mstile-150x150.png | Bin 0 -> 13636 bytes .../public/media/safari-pinned-tab.svg | 47 + packages/govern-console/src/App.css | 40 + packages/govern-console/src/App.test.tsx | 9 + packages/govern-console/src/App.tsx | 58 +- packages/govern-console/src/AragonTheme.tsx | 386 + .../govern-console/src/AugmentedWallet.tsx | 75 + .../src/Providers/GeneralProvider.tsx | 15 - .../src/Providers/Permissions.tsx | 127 - .../govern-console/src/Providers/Wallet.tsx | 82 - .../govern-console/src/ReusableStyles.tsx | 14 + packages/govern-console/src/abis/court.tsx | 3 + packages/govern-console/src/abis/erc20.tsx | 9 + packages/govern-console/src/apps/Erc.tsx | 181 - .../src/assets/aragon-metal.svg | 19 - .../ActionBuilder/ActionBuilder.tsx | 66 + .../ActionBuilder/ActionBuilderModal.tsx | 32 + .../ActionBuilderStateProvider.tsx | 98 + .../ActionBuilder/Screens/AbiForm.tsx | 168 + .../ActionBuilder/Screens/ActionSelector.tsx | 53 + .../ActionBuilder/Screens/AssetWithdrawal.tsx | 243 + .../ActionBuilder/Screens/Deposit.tsx | 248 + .../Screens/FunctionSelector.tsx | 164 + .../ActionBuilder/Screens/TokenMinter.tsx | 166 + .../AddressIdentifier/AddressIdentifier.tsx | 76 + .../AdviceMessages/AdviceMessage.tsx | 67 + .../govern-console/src/components/Button.tsx | 40 - .../src/components/Button/ANButton.tsx | 185 + .../src/components/Button/CloseButton.tsx | 23 + .../src/components/Checkboxs/BlueCheckbox.tsx | 17 + .../CircularProgress/ANCircularProgress.tsx | 82 + .../ANCircularProgressWithCaption.tsx | 59 + .../ConsoleHeader/ConsoleHeader.tsx | 106 + .../src/components/DaoCards/DaoCard.tsx | 71 + .../src/components/DaoCards/DaoProperty.tsx | 43 + .../src/components/DaoHeader/DaoHeader.tsx | 116 + .../src/components/Dialog/Dialog.tsx | 124 + .../src/components/Dialog/FailureDialog.tsx | 92 + .../src/components/Dialog/SuccessDialog.tsx | 50 + .../components/Dialog/TransactionDialog.tsx | 66 + .../src/components/Dialog/TransactionList.tsx | 77 + .../src/components/Dropdown/Dropdown.tsx | 106 + .../src/components/Entity/Entity.tsx | 84 - .../src/components/Field/Field.tsx | 50 + .../src/components/Field/IPFSField.tsx | 46 + .../src/components/Field/IPFSInput.tsx | 181 + .../src/components/Field/JSONField.tsx | 61 + .../FilteredActions/FilteredActions.tsx | 223 - .../src/components/Footer/Footer.tsx | 96 + .../src/components/Frame/Frame.tsx | 32 - .../src/components/Header/Header.tsx | 185 +- .../src/components/HelpButton/HelpButton.tsx | 54 + .../HelpComponent/HelpComponent.tsx | 60 + .../src/components/Hint/Hint.tsx | 21 + .../src/components/Info/Info.tsx | 32 - .../src/components/InputFields/InputField.tsx | 135 + .../src/components/Labels/Label.tsx | 68 + .../src/components/Modal/SimpleModal.tsx | 63 + .../components/Modal/TransactionsModal.tsx | 47 + .../src/components/NewAction/NewAction.tsx | 382 - .../components/PageContent/PageContent.tsx | 38 + .../ProgressBars/BlueProgressBar.tsx | 33 + .../components/ProposalCards/ProposalCard.tsx | 78 + .../PropsalOptions/ProposalOptions.tsx | 119 + .../src/components/Stepper/Stepper.tsx | 120 + .../src/components/Switchs/BlueSwitch.tsx | 62 + .../src/components/TextArea/TextArea.tsx | 12 + .../src/components/Titles/styles.tsx | 32 + .../TransactionKeeper/TransactionKeeper.tsx | 129 + .../src/components/ViewAction/ViewAction.tsx | 471 - .../src/components/ViewDao/ViewDao.tsx | 205 - .../src/components/Wallet/Wallet.tsx | 146 + .../WrapperPaper/ANWrapperPaper.tsx | 31 + packages/govern-console/src/connectors.ts | 10 + .../containers/Console/ConsoleMainPage.tsx | 112 + .../src/containers/CreateDao/CreateDao.tsx | 74 + .../CreateDao/CreateDaoBasicInfo.tsx | 252 + .../CreateDao/CreateDaoCollateral.tsx | 426 + .../containers/CreateDao/CreateDaoConfig.tsx | 224 + .../CreateDao/CreateDaoProgress.tsx | 277 + .../containers/CreateDao/CreateDaoReview.tsx | 206 + .../CreateDao/components/FailAction.tsx | 26 + .../components/ProgressComponent.tsx | 60 + .../components/RegisterSuccessAction.tsx | 21 + .../CreateDao/components/ReviewCard.tsx | 26 + .../CreateDao/components/StepsHeader.tsx | 18 + .../CreateDao/components/SuccessAction.tsx | 65 + .../utils/CreateDaoContextProvider.tsx | 131 + .../src/containers/CreateDao/utils/Shared.tsx | 167 + .../src/containers/DAO/DaoMainPage.tsx | 238 + .../src/containers/DAO/NoDaoFound.tsx | 115 + .../containers/DAOSettings/DAOSettings.tsx | 540 + .../DAOSettings/components/SettingsCard.tsx | 26 + .../src/containers/HomePage/HomePage.tsx | 59 + .../src/containers/HomePage/ModalsContext.tsx | 100 + .../containers/NewExecution/ActionList.tsx | 196 + .../containers/NewExecution/NewExecution.tsx | 240 + .../ProposalDetails/ProposalDetails.tsx | 657 ++ .../components/ChallengeWidget.tsx | 152 + .../components/DecodedActionData.tsx | 80 + .../components/ExecuteWidget.tsx | 67 + .../components/ResolveWidget.tsx | 93 + .../components/SharedStyles.tsx | 43 + packages/govern-console/src/environment.ts | 57 - .../govern-console/src/environment/index.ts | 14 + .../src/environment/networks.ts | 107 + .../govern-console/src/environment/types.ts | 31 + packages/govern-console/src/global.d.ts | 9 + .../govern-console/src/hooks/court-hooks.tsx | 30 + .../src/hooks/proposal-hooks.tsx | 25 + .../govern-console/src/hooks/query-hooks.tsx | 107 + .../src/images/aragon-graphic-only-icon.svg | 24 + .../govern-console/src/images/aragon-icon.zip | Bin 0 -> 1218 bytes .../govern-console/src/images/back-btn.svg | 3 + .../src/images/connected-user-icon.svg | 9 + .../src/images/console-header.svg | 19 + .../src/images/dao-not-found.svg | 14 + .../src/images/ds/help-icon.svg | 3 + .../src/images/ds/remove-option.svg | 5 + .../src/images/pngs/create_dao@2x.png | Bin 0 -> 73467 bytes .../src/images/pngs/dao_setting_@2x.png | Bin 0 -> 45541 bytes .../src/images/pngs/help_face_@2x.png | Bin 0 -> 69083 bytes .../src/images/pngs/review_create_dao@2x.png | Bin 0 -> 35608 bytes .../govern-console/src/images/svgs/Aragon.svg | 9 + .../src/images/svgs/Blue_tick.svg | 4 + .../src/images/svgs/CreateDao.svg | 9 + .../src/images/svgs/CreateDaoInProgress.svg | 9 + .../src/images/svgs/DefaultImageAddress.svg | 9 + .../src/images/svgs/Setting_Icon.svg | 3 + .../src/images/svgs/aragon-icon.svg | 54 + .../src/images/svgs/check_box_checked.svg | 19 + .../src/images/svgs/check_box_unchecked.svg | 18 + .../govern-console/src/images/svgs/cross.svg | 4 + .../src/images/svgs/discord.svg | 11 + .../src/images/svgs/green_tick.svg | 4 + .../src/images/svgs/message.svg | 14 + .../src/images/svgs/telegrama.svg | 10 + .../src/images/svgs/twitter.svg | 9 + .../src/images/svgs/youtube.svg | 10 + packages/govern-console/src/index.css | 9 + packages/govern-console/src/index.tsx | 123 +- packages/govern-console/src/ipfs.d.ts | 1 - .../src/lib/abi/GovernQueue.json | 1843 ---- .../govern-console/src/lib/abi/erc20.json | 175 - packages/govern-console/src/lib/chain-id.ts | 26 - .../govern-console/src/lib/known-chains.ts | 2 - .../govern-console/src/lib/known-roles.ts | 10 - packages/govern-console/src/lib/routing.ts | 22 - .../govern-console/src/lib/web3-contracts.ts | 33 - packages/govern-console/src/lib/web3-utils.ts | 131 - packages/govern-console/src/logo.svg | 1 + .../govern-console/src/pages/SelectDao.tsx | 50 - packages/govern-console/src/pages/ViewDao.tsx | 145 - packages/govern-console/src/queries/court.tsx | 10 + packages/govern-console/src/queries/dao.tsx | 92 + .../govern-console/src/queries/proposals.tsx | 121 + .../govern-console/src/reportWebVitals.ts | 15 + .../govern-console/src/services/Executor.ts | 93 + .../govern-console/src/services/Proposal.tsx | 84 + .../src/services/QueueApprovals.tsx | 85 + .../govern-console/src/services/analytics.ts | 85 + packages/govern-console/src/setupTests.ts | 5 + packages/govern-console/src/styled.d.ts | 7 - packages/govern-console/src/styles.ts | 9 + .../govern-console/src/utils/AbiFetcher.tsx | 42 + .../govern-console/src/utils/AbiHandler.tsx | 225 + packages/govern-console/src/utils/Asset.ts | 96 + packages/govern-console/src/utils/ERC3000.tsx | 82 + packages/govern-console/src/utils/Error.ts | 3 + .../govern-console/src/utils/HelpText.tsx | 88 + .../src/utils/HelperFunctions.tsx | 43 + packages/govern-console/src/utils/account.tsx | 4 + packages/govern-console/src/utils/actions.tsx | 8 + .../govern-console/src/utils/constants.tsx | 9 + packages/govern-console/src/utils/date.tsx | 24 + packages/govern-console/src/utils/ipfs.tsx | 188 + packages/govern-console/src/utils/lib.tsx | 37 + packages/govern-console/src/utils/radspec.tsx | 22 + .../govern-console/src/utils/scrollToId.tsx | 10 + packages/govern-console/src/utils/states.tsx | 56 + packages/govern-console/src/utils/token.tsx | 62 + .../src/utils/transactionHelper.tsx | 78 + .../govern-console/src/utils/transforms.tsx | 18 + packages/govern-console/src/utils/types.tsx | 89 + packages/govern-console/src/utils/urls.tsx | 20 + .../govern-console/src/utils/validations.tsx | 164 + packages/govern-console/tsconfig.json | 12 +- packages/govern-contract-utils/.gitignore | 4 +- packages/govern-contract-utils/README.md | 2 +- .../contracts/erc20/ERC20.sol | 8 + .../govern-contract-utils/hardhat.config.ts | 1 + .../govern-contract-utils/test/acl.test.ts | 120 +- .../test/adaptive-erc165.test.ts | 14 +- .../test/address-utils.test.ts | 20 +- .../test/bitmaplib.test.ts | 13 +- .../test/deposit-lib.test.ts | 198 +- .../test/erc1167-proxy-factory.test.ts | 33 +- .../test/initializable.test.ts | 33 +- .../test/safe-erc20.test.ts | 185 +- packages/govern-contract-utils/tsconfig.json | 1 - packages/govern-core/contracts/Govern.sol | 56 +- .../govern-core/contracts/GovernRegistry.sol | 3 +- .../contracts/pipelines/GovernQueue.sol | 23 +- .../test/chai-utils/equal-overwrite.ts | 57 + packages/govern-core/test/chai-utils/index.ts | 5 + .../govern-core/test/govern-registry.test.ts | 14 +- packages/govern-core/test/govern.test.ts | 64 +- .../govern-core/test/pipelines/container.ts | 43 +- .../test/pipelines/govern-queue.test.ts | 611 +- packages/govern-core/tsconfig.json | 20 +- packages/govern-create/.env.sample | 2 + packages/govern-create/.gitignore | 1 + packages/govern-create/README.md | 13 +- .../contracts/GovernBaseFactory.sol | 108 +- .../core-factories/GovernQueueFactory.sol | 5 +- .../contracts/test/GovernQueueFactoryMock.sol | 26 +- .../contracts/test/GovernRegistryMock.sol | 5 +- .../contracts/test/GovernTokenFactoryMock.sol | 19 +- packages/govern-create/deploy/factories.ts | 9 +- packages/govern-create/deploy/registry.ts | 2 +- packages/govern-create/deploy/verify.ts | 21 +- packages/govern-create/hardhat.config.ts | 22 +- packages/govern-create/package.json | 7 +- packages/govern-create/tasks/ens.ts | 304 + packages/govern-create/tasks/govern.ts | 29 +- packages/govern-create/test/ens-e2e.test.ts | 330 + .../test/govern-base-factory-e2e.test.ts | 357 +- .../test/govern-base-factory-unit.test.ts | 150 +- packages/govern-create/utils/ens.ts | 108 + packages/govern-create/utils/etherscan.ts | 5 +- packages/govern-create/utils/network.ts | 3 + packages/govern-discord/server.js | 6 +- packages/govern-server/docker-compose.yml | 28 +- .../manifest/data/mainnet.json | 4 +- .../manifest/data/rinkeby-staging.json | 4 +- .../manifest/data/rinkeby.json | 4 +- .../contracts/GovernRegistry.template.yaml | 6 +- packages/govern-subgraph/package.json | 3 +- packages/govern-subgraph/schema.graphql | 82 +- .../govern-subgraph/scripts/build-manifest.sh | 2 + packages/govern-subgraph/src/Govern.ts | 62 +- packages/govern-subgraph/src/GovernQueue.ts | 133 +- .../govern-subgraph/src/GovernRegistry.ts | 45 +- packages/govern-subgraph/src/lib/MiniACL.ts | 6 +- .../govern-subgraph/src/utils/constants.ts | 5 +- packages/govern-subgraph/src/utils/events.ts | 97 +- packages/govern-subgraph/src/utils/tokens.ts | 25 + .../govern-subgraph/src/utils/transforms.ts | 5 + .../govern-subgraph/subgraph.template.yaml | 14 +- packages/govern-token/.gitignore | 1 + packages/govern-token/README.md | 8 +- .../contracts/GovernTokenFactory.sol | 25 +- .../contracts/libraries/TokenLib.sol | 25 + packages/govern-token/deploy/factory.ts | 1 - packages/govern-token/hardhat.config.ts | 14 +- packages/govern-token/lib/utils.js | 1 - packages/govern-token/package.json | 2 +- packages/govern-token/tasks/token.js | 85 +- .../govern-token/test/govern-token-factory.js | 297 +- packages/govern-token/test/govern-token.js | 656 +- packages/govern-token/test/helpers/erc2612.js | 35 +- packages/govern-token/test/helpers/erc3009.js | 56 +- packages/govern-token/test/helpers/erc712.js | 11 +- .../test/helpers/merkle-tree/balance-tree.ts | 20 +- .../test/helpers/merkle-tree/merkle-tree.ts | 10 +- .../govern-token/test/merkle-distributor.js | 297 +- packages/govern/.gitignore | 3 + packages/govern/hardhat.config.ts | 49 + packages/govern/internal/actions/DaoAction.ts | 9 +- .../govern/internal/actions/DaosAction.ts | 5 +- .../govern/internal/actions/RegisterToken.ts | 40 + .../govern/internal/actions/lib/Gateway.ts | 13 + .../internal/clients/graphql/GraphQLClient.ts | 17 +- .../{registry-entry.ts => dao-entry.ts} | 187 +- .../internal/clients/graphql/queries/dao.ts | 24 +- .../internal/clients/graphql/queries/daos.ts | 18 +- .../internal/clients/lib/ClientInterface.ts | 3 +- .../internal/clients/lib/types/Address.ts | 2 +- .../internal/configuration/ConfigDefaults.ts | 23 + .../internal/configuration/Configuration.ts | 73 +- packages/govern/jest.config.e2e.js | 2 +- packages/govern/jest.config.js | 14 +- packages/govern/package.json | 15 +- packages/govern/public/configure.ts | 4 +- packages/govern/public/createDao.ts | 176 + packages/govern/public/dao.ts | 6 +- packages/govern/public/daos.ts | 2 +- packages/govern/public/index.ts | 32 +- packages/govern/public/proposal.ts | 237 + packages/govern/rollup.config.js | 44 + packages/govern/scripts/start.e2e.sh | 13 - packages/govern/tests/e2e/config.ts | 2 + packages/govern/tests/e2e/daoTest.e2e.ts | 82 +- packages/govern/tests/e2e/daosTest.e2e.ts | 33 +- packages/govern/tests/e2e/queryTest.e2e.ts | 11 +- packages/govern/tests/hardhat/Gateway.test.ts | 16 + .../govern/tests/hardhat/createDaoTest.hd.ts | 264 + .../govern/tests/hardhat/proposal.test.ts | 384 + .../tests/internal/actions/DaoActionTest.ts | 11 +- .../tests/internal/actions/DaosActionTest.ts | 9 +- .../actions/lib/AbstractActionTest.ts | 1 - .../internal/clients/GraphQLClientTest.ts | 44 +- .../configuration/ConfigurationTest.ts | 35 +- .../govern/tests/public/configurationTest.ts | 9 +- packages/govern/tests/public/daoTest.ts | 2 +- packages/govern/tests/public/daosTest.ts | 2 +- packages/govern/tests/public/queryTest.ts | 17 +- packages/govern/tsconfig.cjs.json | 14 +- packages/govern/tsconfig.esm.json | 15 +- packages/govern/tsconfig.json | 16 +- packages/govern/utils/events.ts | 40 + yarn.lock | 8997 ++++++++++++----- 360 files changed, 25155 insertions(+), 9208 deletions(-) create mode 100644 .github/workflows/govern-ci-cd.yml create mode 100644 .github/workflows/govern-console-ci-cd.yml create mode 100644 .husky/_/husky.sh create mode 100755 .husky/pre-commit rename packages/{govern-core/test/pipelines/helpers.ts => erc3k/utils/ERC3000.ts} (52%) create mode 100644 packages/govern-console/.babelrc delete mode 100644 packages/govern-console/.eslintrc.js create mode 100644 packages/govern-console/.eslintrc.json rename packages/govern-console/{.prettierrc => .prettierrc.json} (50%) create mode 100644 packages/govern-console/LICENSE create mode 100644 packages/govern-console/config-overrides.js create mode 100644 packages/govern-console/decs.d.ts create mode 100644 packages/govern-console/fleek/console.mainnet.json create mode 100644 packages/govern-console/fleek/console.rinkeby.json create mode 100644 packages/govern-console/fleek/console.rinkeby.staging.json create mode 100644 packages/govern-console/overrides-mui.d.ts delete mode 100644 packages/govern-console/public/favicon.png delete mode 100644 packages/govern-console/public/logo192.png delete mode 100644 packages/govern-console/public/logo512.png create mode 100644 packages/govern-console/public/media/android-chrome-192x192.png create mode 100644 packages/govern-console/public/media/android-chrome-512x512.png create mode 100644 packages/govern-console/public/media/apple-touch-icon.png create mode 100644 packages/govern-console/public/media/browserconfig.xml create mode 100644 packages/govern-console/public/media/favicon-16x16.png create mode 100644 packages/govern-console/public/media/favicon-32x32.png create mode 100644 packages/govern-console/public/media/favicon.ico create mode 100644 packages/govern-console/public/media/mstile-150x150.png create mode 100644 packages/govern-console/public/media/safari-pinned-tab.svg create mode 100644 packages/govern-console/src/App.css create mode 100644 packages/govern-console/src/App.test.tsx create mode 100644 packages/govern-console/src/AragonTheme.tsx create mode 100644 packages/govern-console/src/AugmentedWallet.tsx delete mode 100644 packages/govern-console/src/Providers/GeneralProvider.tsx delete mode 100644 packages/govern-console/src/Providers/Permissions.tsx delete mode 100644 packages/govern-console/src/Providers/Wallet.tsx create mode 100644 packages/govern-console/src/ReusableStyles.tsx create mode 100644 packages/govern-console/src/abis/court.tsx create mode 100644 packages/govern-console/src/abis/erc20.tsx delete mode 100644 packages/govern-console/src/apps/Erc.tsx delete mode 100644 packages/govern-console/src/assets/aragon-metal.svg create mode 100644 packages/govern-console/src/components/ActionBuilder/ActionBuilder.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/ActionBuilderModal.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/ActionBuilderStateProvider.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/AbiForm.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/ActionSelector.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/AssetWithdrawal.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/Deposit.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/FunctionSelector.tsx create mode 100644 packages/govern-console/src/components/ActionBuilder/Screens/TokenMinter.tsx create mode 100644 packages/govern-console/src/components/AddressIdentifier/AddressIdentifier.tsx create mode 100644 packages/govern-console/src/components/AdviceMessages/AdviceMessage.tsx delete mode 100644 packages/govern-console/src/components/Button.tsx create mode 100644 packages/govern-console/src/components/Button/ANButton.tsx create mode 100644 packages/govern-console/src/components/Button/CloseButton.tsx create mode 100644 packages/govern-console/src/components/Checkboxs/BlueCheckbox.tsx create mode 100644 packages/govern-console/src/components/CircularProgress/ANCircularProgress.tsx create mode 100644 packages/govern-console/src/components/CircularProgress/ANCircularProgressWithCaption.tsx create mode 100644 packages/govern-console/src/components/ConsoleHeader/ConsoleHeader.tsx create mode 100644 packages/govern-console/src/components/DaoCards/DaoCard.tsx create mode 100644 packages/govern-console/src/components/DaoCards/DaoProperty.tsx create mode 100644 packages/govern-console/src/components/DaoHeader/DaoHeader.tsx create mode 100644 packages/govern-console/src/components/Dialog/Dialog.tsx create mode 100644 packages/govern-console/src/components/Dialog/FailureDialog.tsx create mode 100644 packages/govern-console/src/components/Dialog/SuccessDialog.tsx create mode 100644 packages/govern-console/src/components/Dialog/TransactionDialog.tsx create mode 100644 packages/govern-console/src/components/Dialog/TransactionList.tsx create mode 100644 packages/govern-console/src/components/Dropdown/Dropdown.tsx delete mode 100644 packages/govern-console/src/components/Entity/Entity.tsx create mode 100644 packages/govern-console/src/components/Field/Field.tsx create mode 100644 packages/govern-console/src/components/Field/IPFSField.tsx create mode 100644 packages/govern-console/src/components/Field/IPFSInput.tsx create mode 100644 packages/govern-console/src/components/Field/JSONField.tsx delete mode 100644 packages/govern-console/src/components/FilteredActions/FilteredActions.tsx create mode 100644 packages/govern-console/src/components/Footer/Footer.tsx delete mode 100644 packages/govern-console/src/components/Frame/Frame.tsx create mode 100644 packages/govern-console/src/components/HelpButton/HelpButton.tsx create mode 100644 packages/govern-console/src/components/HelpComponent/HelpComponent.tsx create mode 100644 packages/govern-console/src/components/Hint/Hint.tsx delete mode 100644 packages/govern-console/src/components/Info/Info.tsx create mode 100644 packages/govern-console/src/components/InputFields/InputField.tsx create mode 100644 packages/govern-console/src/components/Labels/Label.tsx create mode 100644 packages/govern-console/src/components/Modal/SimpleModal.tsx create mode 100644 packages/govern-console/src/components/Modal/TransactionsModal.tsx delete mode 100644 packages/govern-console/src/components/NewAction/NewAction.tsx create mode 100644 packages/govern-console/src/components/PageContent/PageContent.tsx create mode 100644 packages/govern-console/src/components/ProgressBars/BlueProgressBar.tsx create mode 100644 packages/govern-console/src/components/ProposalCards/ProposalCard.tsx create mode 100644 packages/govern-console/src/components/PropsalOptions/ProposalOptions.tsx create mode 100644 packages/govern-console/src/components/Stepper/Stepper.tsx create mode 100644 packages/govern-console/src/components/Switchs/BlueSwitch.tsx create mode 100644 packages/govern-console/src/components/TextArea/TextArea.tsx create mode 100644 packages/govern-console/src/components/Titles/styles.tsx create mode 100644 packages/govern-console/src/components/TransactionKeeper/TransactionKeeper.tsx delete mode 100644 packages/govern-console/src/components/ViewAction/ViewAction.tsx delete mode 100644 packages/govern-console/src/components/ViewDao/ViewDao.tsx create mode 100644 packages/govern-console/src/components/Wallet/Wallet.tsx create mode 100644 packages/govern-console/src/components/WrapperPaper/ANWrapperPaper.tsx create mode 100644 packages/govern-console/src/connectors.ts create mode 100644 packages/govern-console/src/containers/Console/ConsoleMainPage.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDao.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDaoBasicInfo.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDaoCollateral.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDaoConfig.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDaoProgress.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/CreateDaoReview.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/FailAction.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/ProgressComponent.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/RegisterSuccessAction.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/ReviewCard.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/StepsHeader.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/components/SuccessAction.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/utils/CreateDaoContextProvider.tsx create mode 100644 packages/govern-console/src/containers/CreateDao/utils/Shared.tsx create mode 100644 packages/govern-console/src/containers/DAO/DaoMainPage.tsx create mode 100644 packages/govern-console/src/containers/DAO/NoDaoFound.tsx create mode 100644 packages/govern-console/src/containers/DAOSettings/DAOSettings.tsx create mode 100644 packages/govern-console/src/containers/DAOSettings/components/SettingsCard.tsx create mode 100644 packages/govern-console/src/containers/HomePage/HomePage.tsx create mode 100644 packages/govern-console/src/containers/HomePage/ModalsContext.tsx create mode 100644 packages/govern-console/src/containers/NewExecution/ActionList.tsx create mode 100644 packages/govern-console/src/containers/NewExecution/NewExecution.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/ProposalDetails.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/components/ChallengeWidget.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/components/DecodedActionData.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/components/ExecuteWidget.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/components/ResolveWidget.tsx create mode 100644 packages/govern-console/src/containers/ProposalDetails/components/SharedStyles.tsx delete mode 100644 packages/govern-console/src/environment.ts create mode 100644 packages/govern-console/src/environment/index.ts create mode 100644 packages/govern-console/src/environment/networks.ts create mode 100644 packages/govern-console/src/environment/types.ts create mode 100644 packages/govern-console/src/global.d.ts create mode 100644 packages/govern-console/src/hooks/court-hooks.tsx create mode 100644 packages/govern-console/src/hooks/proposal-hooks.tsx create mode 100644 packages/govern-console/src/hooks/query-hooks.tsx create mode 100644 packages/govern-console/src/images/aragon-graphic-only-icon.svg create mode 100644 packages/govern-console/src/images/aragon-icon.zip create mode 100644 packages/govern-console/src/images/back-btn.svg create mode 100644 packages/govern-console/src/images/connected-user-icon.svg create mode 100644 packages/govern-console/src/images/console-header.svg create mode 100644 packages/govern-console/src/images/dao-not-found.svg create mode 100644 packages/govern-console/src/images/ds/help-icon.svg create mode 100644 packages/govern-console/src/images/ds/remove-option.svg create mode 100644 packages/govern-console/src/images/pngs/create_dao@2x.png create mode 100644 packages/govern-console/src/images/pngs/dao_setting_@2x.png create mode 100644 packages/govern-console/src/images/pngs/help_face_@2x.png create mode 100644 packages/govern-console/src/images/pngs/review_create_dao@2x.png create mode 100644 packages/govern-console/src/images/svgs/Aragon.svg create mode 100644 packages/govern-console/src/images/svgs/Blue_tick.svg create mode 100644 packages/govern-console/src/images/svgs/CreateDao.svg create mode 100644 packages/govern-console/src/images/svgs/CreateDaoInProgress.svg create mode 100644 packages/govern-console/src/images/svgs/DefaultImageAddress.svg create mode 100644 packages/govern-console/src/images/svgs/Setting_Icon.svg create mode 100644 packages/govern-console/src/images/svgs/aragon-icon.svg create mode 100644 packages/govern-console/src/images/svgs/check_box_checked.svg create mode 100644 packages/govern-console/src/images/svgs/check_box_unchecked.svg create mode 100644 packages/govern-console/src/images/svgs/cross.svg create mode 100644 packages/govern-console/src/images/svgs/discord.svg create mode 100644 packages/govern-console/src/images/svgs/green_tick.svg create mode 100644 packages/govern-console/src/images/svgs/message.svg create mode 100644 packages/govern-console/src/images/svgs/telegrama.svg create mode 100644 packages/govern-console/src/images/svgs/twitter.svg create mode 100644 packages/govern-console/src/images/svgs/youtube.svg delete mode 100644 packages/govern-console/src/ipfs.d.ts delete mode 100644 packages/govern-console/src/lib/abi/GovernQueue.json delete mode 100644 packages/govern-console/src/lib/abi/erc20.json delete mode 100644 packages/govern-console/src/lib/chain-id.ts delete mode 100644 packages/govern-console/src/lib/known-chains.ts delete mode 100644 packages/govern-console/src/lib/known-roles.ts delete mode 100644 packages/govern-console/src/lib/routing.ts delete mode 100644 packages/govern-console/src/lib/web3-contracts.ts delete mode 100644 packages/govern-console/src/lib/web3-utils.ts create mode 100644 packages/govern-console/src/logo.svg delete mode 100644 packages/govern-console/src/pages/SelectDao.tsx delete mode 100644 packages/govern-console/src/pages/ViewDao.tsx create mode 100644 packages/govern-console/src/queries/court.tsx create mode 100644 packages/govern-console/src/queries/dao.tsx create mode 100644 packages/govern-console/src/queries/proposals.tsx create mode 100644 packages/govern-console/src/reportWebVitals.ts create mode 100644 packages/govern-console/src/services/Executor.ts create mode 100644 packages/govern-console/src/services/Proposal.tsx create mode 100644 packages/govern-console/src/services/QueueApprovals.tsx create mode 100644 packages/govern-console/src/services/analytics.ts create mode 100644 packages/govern-console/src/setupTests.ts delete mode 100644 packages/govern-console/src/styled.d.ts create mode 100644 packages/govern-console/src/styles.ts create mode 100644 packages/govern-console/src/utils/AbiFetcher.tsx create mode 100644 packages/govern-console/src/utils/AbiHandler.tsx create mode 100644 packages/govern-console/src/utils/Asset.ts create mode 100644 packages/govern-console/src/utils/ERC3000.tsx create mode 100644 packages/govern-console/src/utils/Error.ts create mode 100644 packages/govern-console/src/utils/HelpText.tsx create mode 100644 packages/govern-console/src/utils/HelperFunctions.tsx create mode 100644 packages/govern-console/src/utils/account.tsx create mode 100644 packages/govern-console/src/utils/actions.tsx create mode 100644 packages/govern-console/src/utils/constants.tsx create mode 100644 packages/govern-console/src/utils/date.tsx create mode 100644 packages/govern-console/src/utils/ipfs.tsx create mode 100644 packages/govern-console/src/utils/lib.tsx create mode 100644 packages/govern-console/src/utils/radspec.tsx create mode 100644 packages/govern-console/src/utils/scrollToId.tsx create mode 100644 packages/govern-console/src/utils/states.tsx create mode 100644 packages/govern-console/src/utils/token.tsx create mode 100644 packages/govern-console/src/utils/transactionHelper.tsx create mode 100644 packages/govern-console/src/utils/transforms.tsx create mode 100644 packages/govern-console/src/utils/types.tsx create mode 100644 packages/govern-console/src/utils/urls.tsx create mode 100644 packages/govern-console/src/utils/validations.tsx create mode 100644 packages/govern-core/test/chai-utils/equal-overwrite.ts create mode 100644 packages/govern-core/test/chai-utils/index.ts create mode 100644 packages/govern-create/.env.sample create mode 100644 packages/govern-create/tasks/ens.ts create mode 100644 packages/govern-create/test/ens-e2e.test.ts create mode 100644 packages/govern-create/utils/ens.ts create mode 100644 packages/govern-subgraph/src/utils/tokens.ts create mode 100644 packages/govern-subgraph/src/utils/transforms.ts create mode 100644 packages/govern-token/contracts/libraries/TokenLib.sol create mode 100644 packages/govern/hardhat.config.ts create mode 100644 packages/govern/internal/actions/RegisterToken.ts create mode 100644 packages/govern/internal/actions/lib/Gateway.ts rename packages/govern/internal/clients/graphql/fragments/{registry-entry.ts => dao-entry.ts} (56%) create mode 100644 packages/govern/internal/configuration/ConfigDefaults.ts create mode 100644 packages/govern/public/createDao.ts create mode 100644 packages/govern/public/proposal.ts create mode 100644 packages/govern/rollup.config.js delete mode 100755 packages/govern/scripts/start.e2e.sh create mode 100644 packages/govern/tests/e2e/config.ts create mode 100644 packages/govern/tests/hardhat/Gateway.test.ts create mode 100644 packages/govern/tests/hardhat/createDaoTest.hd.ts create mode 100644 packages/govern/tests/hardhat/proposal.test.ts create mode 100644 packages/govern/utils/events.ts diff --git a/.github/workflows/contracts-ci-cd.yml b/.github/workflows/contracts-ci-cd.yml index db7f3cc2f..4723d78f5 100644 --- a/.github/workflows/contracts-ci-cd.yml +++ b/.github/workflows/contracts-ci-cd.yml @@ -4,85 +4,39 @@ jobs: coverage: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - - name: Install node - uses: actions/setup-node@v1 - with: - node-version: 12 - - - name: Cache yarn modules - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: yarn-${{ hashFiles('yarn.lock') }} - - - name: Cache contracts - uses: actions/cache@v2 - with: - path: | - packages/*/cache - packages/*/artifacts - ~/.cache/buidler-nodejs/ - ~/.cache/hardhat-nodejs/ - key: contracts-${{ hashFiles('packages/*/contracts/**/*.sol') }} - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Build contracts - run: yarn compile:cached - - - name: Run coverage - run: yarn coverage - - - name: Upload report - run: bash <(curl -s https://codecov.io/bash) - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - - - deploy-rinkeby: - if: github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - needs: coverage - env: - CD: true - ETH_KEY: ${{ secrets.ETH_KEY }} - ETHERSCAN_KEY: ${{ secrets.ETHERSCAN_KEY }} - REGISTRY_RINKEBY: "0x87eE5EA31dCf1f526f21Bb576131C37890AE65E0" - steps: - - uses: actions/checkout@v1 - - - name: Install node - uses: actions/setup-node@v1 - with: - node-version: 12 - - - name: Cache yarn modules - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: yarn-${{ hashFiles('yarn.lock') }} - - - name: Cache contracts - uses: actions/cache@v2 - with: - path: | - packages/*/cache - packages/*/artifacts - ~/.cache/buidler-nodejs/ - ~/.cache/hardhat-nodejs/ - key: contracts-${{ hashFiles('packages/*/contracts/**/*.sol') }} - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Deploy Factory - run: cd packages/govern-create && yarn deploy --network rinkeby - - - name: Deploy Govern - run: cd packages/govern-create && yarn deploy-govern --network rinkeby > github-message - - - name: Log - run: cat packages/govern-create/github-message + - uses: actions/checkout@v1 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Cache yarn modules + uses: actions/cache@v2 + with: + path: '**/node_modules' + key: yarn-${{ hashFiles('yarn.lock') }} + + - name: Cache contracts + uses: actions/cache@v2 + with: + path: | + packages/*/cache + packages/*/artifacts + ~/.cache/buidler-nodejs/ + ~/.cache/hardhat-nodejs/ + key: contracts-${{ hashFiles('packages/*/contracts/**/*.sol') }} + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build contracts + run: yarn compile:cached + + - name: Run coverage + run: yarn coverage + + - name: Upload report + run: bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/govern-ci-cd.yml b/.github/workflows/govern-ci-cd.yml new file mode 100644 index 000000000..32a80fc9b --- /dev/null +++ b/.github/workflows/govern-ci-cd.yml @@ -0,0 +1,28 @@ +name: Govern API tests +on: + push: + paths: + - 'packages/govern/**' + +jobs: + Test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Cache yarn modules + uses: actions/cache@v2 + with: + path: '**/node_modules' + key: yarn-${{ hashFiles('yarn.lock') }} + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Run all govern tests + run: cd packages/govern && yarn test diff --git a/.github/workflows/govern-console-ci-cd.yml b/.github/workflows/govern-console-ci-cd.yml new file mode 100644 index 000000000..0e9223246 --- /dev/null +++ b/.github/workflows/govern-console-ci-cd.yml @@ -0,0 +1,124 @@ +name: Govern-Console CI/CD +on: + push: + paths: + - 'packages/govern-console/**' + branches: + - 'develop' + - 'master' + +env: + working-directory: packages/govern-console + +jobs: + build-and-deploy-rinkeby: + runs-on: ubuntu-latest + container: fleek/create-react-app:node-15 + name: builds and deploys console on rinkeby + if: github.ref == 'refs/heads/develop' + environment: Rinkeby + defaults: + run: + working-directory: ${{env.working-directory}} + steps: + - uses: actions/checkout@v2 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Build the Govern + run: cd ../govern && yarn install --frozen-lockfile && yarn build + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build the app + run: CI='' yarn build:rinkeby + env: + REACT_APP_ANALYTICS_KEY: ${{ secrets.REACT_APP_ANALYTICS_KEY }} + + - name: Activate rinkeby's fleek + run: mv fleek/console.rinkeby.json .fleek.json + + - name: deploy console + id: deploy + uses: fleekhq/action-deploy@v0.1.4-beta2 + with: + apiKey: ${{ secrets.FLEEK_API_KEY }} + workDir: ${{env.working-directory}} + + build-and-deploy-rinkeby-staging: + runs-on: ubuntu-latest + container: fleek/create-react-app:node-15 + name: builds and deploys console on rinkeby's staging + if: github.ref == 'refs/heads/develop' + defaults: + run: + working-directory: ${{env.working-directory}} + steps: + - uses: actions/checkout@v2 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Build the Govern + run: cd ../govern && yarn install --frozen-lockfile && yarn build + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build the app + run: CI='' yarn build:staging + + - name: Activate rinkeby's staging's fleek + run: mv fleek/console.rinkeby.staging.json .fleek.json + + - name: deploy console + id: deploy + uses: fleekhq/action-deploy@v0.1.4-beta2 + with: + apiKey: ${{ secrets.FLEEK_API_KEY }} + workDir: ${{env.working-directory}} + + build-and-deploy-mainnet: + runs-on: ubuntu-latest + container: fleek/create-react-app:node-15 + name: builds and deploys console on mainnet + if: github.ref == 'refs/heads/master' + environment: Mainnet + defaults: + run: + working-directory: ${{env.working-directory}} + steps: + - uses: actions/checkout@v2 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Build the Govern + run: cd ../govern && yarn install --frozen-lockfile && yarn build + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build the app + run: CI='' yarn build:mainnet + env: + REACT_APP_ANALYTICS_KEY: ${{ secrets.REACT_APP_ANALYTICS_KEY }} + + - name: Activate mainnet's fleek + run: mv fleek/console.mainnet.json .fleek.json + + - name: deploy console + id: deploy + uses: fleekhq/action-deploy@v0.1.4-beta2 + with: + apiKey: ${{ secrets.FLEEK_API_KEY }} + workDir: ${{env.working-directory}} + diff --git a/.github/workflows/server-ci-cd.yml b/.github/workflows/server-ci-cd.yml index 77517bfef..93364331c 100644 --- a/.github/workflows/server-ci-cd.yml +++ b/.github/workflows/server-ci-cd.yml @@ -1,10 +1,12 @@ name: Server CI/CD on: push: + paths: + - 'packages/govern-server/**' branches: - - master - tags: - - v* + - master + - develop + env: # This is a base repository and we use git refs to set the version of the container # ${GITHUB_REF##*/} will be either a branch name or a tag depending on the event @@ -14,39 +16,39 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - run: docker login -u ${{secrets.DOCKERHUB_USER}} -p ${{secrets.DOCKERHUB_TOKEN}} - - run: .github/scripts/docker-build.sh . $REPO ${GITHUB_SHA} + - uses: actions/checkout@v2 + - run: docker login -u ${{secrets.DOCKERHUB_USER}} -p ${{secrets.DOCKERHUB_TOKEN}} + - run: .github/scripts/docker-build.sh . $REPO ${GITHUB_SHA} release: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v2 - - run: docker login -u ${{secrets.DOCKERHUB_USER}} -p ${{secrets.DOCKERHUB_TOKEN}} - - run: .github/scripts/docker-release.sh $REPO:${GITHUB_SHA} $REPO:${GITHUB_REF##*/} - - run: .github/scripts/docker-release.sh $REPO:${GITHUB_SHA} $REPO:latest + - uses: actions/checkout@v2 + - run: docker login -u ${{secrets.DOCKERHUB_USER}} -p ${{secrets.DOCKERHUB_TOKEN}} + - run: .github/scripts/docker-release.sh $REPO:${GITHUB_SHA} $REPO:${GITHUB_REF##*/} + - run: .github/scripts/docker-release.sh $REPO:${GITHUB_SHA} $REPO:latest deploy-rinkeby: - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/develop' runs-on: ubuntu-latest needs: release steps: - - uses: actions/checkout@v2 - - run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} - - run: .github/scripts/kubectl-set-image.sh govern-server-rinkeby $REPO:${GITHUB_REF##*/} - - run: .github/scripts/kubectl-wait-ready.sh govern-server-rinkeby - # wait 10 sec for k8s to reroute ingress and check the endpoint - - run: sleep 10 && curl --fail https://govern-rinkeby.backend.aragon.org -H accept:text/html + - uses: actions/checkout@v2 + - run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} + - run: .github/scripts/kubectl-set-image.sh govern-server-rinkeby $REPO:${GITHUB_REF##*/} + - run: .github/scripts/kubectl-wait-ready.sh govern-server-rinkeby + # wait 10 sec for k8s to reroute ingress and check the endpoint + - run: sleep 10 && curl --fail https://govern-rinkeby.backend.aragon.org -H accept:text/html deploy-mainnet: - if: startsWith(github.ref, 'refs/tags/v') + if: startsWith(github.ref, 'refs/heads/master') runs-on: ubuntu-latest needs: release steps: - - uses: actions/checkout@v2 - - run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} - - run: .github/scripts/kubectl-set-image.sh govern-server $REPO:${GITHUB_REF##*/} - - run: .github/scripts/kubectl-wait-ready.sh govern-server - # wait 10 sec for k8s to reroute ingress and check the endpoint - - run: sleep 10 && curl --fail https://govern.backend.aragon.org -H accept:text/html + - uses: actions/checkout@v2 + - run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} + - run: .github/scripts/kubectl-set-image.sh govern-server $REPO:${GITHUB_REF##*/} + - run: .github/scripts/kubectl-wait-ready.sh govern-server + # wait 10 sec for k8s to reroute ingress and check the endpoint + - run: sleep 10 && curl --fail https://govern.backend.aragon.org -H accept:text/html diff --git a/.github/workflows/subgraph-ci-cd.yml b/.github/workflows/subgraph-ci-cd.yml index 9123d217b..65b6faaeb 100644 --- a/.github/workflows/subgraph-ci-cd.yml +++ b/.github/workflows/subgraph-ci-cd.yml @@ -1,10 +1,12 @@ name: Subgraph CI/CD on: push: + paths: + - 'packages/govern-subgraph/**' branches: - - master - tags: - - v* + - master + - develop + env: GRAPHKEY: ${{secrets.GRAPHKEY}} @@ -12,42 +14,46 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - name: Install node - uses: actions/setup-node@v1 - with: - node-version: 12 - - - name: Cache yarn modules - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: yarn-${{ hashFiles('yarn.lock') }} - - - name: Cache contracts - uses: actions/cache@v2 - with: - path: | - packages/*/cache - packages/*/artifacts - ~/.cache/buidler-nodejs/ - ~/.cache/hardhat-nodejs/ - key: contracts-${{ hashFiles('packages/*/contracts/**/*.sol') }} - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Build contracts - run: yarn compile:cached - - - name: Configure k8s - run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} - - - name: Deploy rinkeby - if: github.ref == 'refs/heads/master' - run: yarn deploy:subgraph:rinkeby - - - name: Deploy mainnet - if: startsWith(github.ref, 'refs/tags/v') - run: yarn deploy:subgraph:mainnet + - uses: actions/checkout@v2 + + - name: Install node + uses: actions/setup-node@v1 + with: + node-version: 14.15.5 + + - name: Cache yarn modules + uses: actions/cache@v2 + with: + path: '**/node_modules' + key: yarn-${{ hashFiles('yarn.lock') }} + + - name: Cache contracts + uses: actions/cache@v2 + with: + path: | + packages/*/cache + packages/*/artifacts + ~/.cache/buidler-nodejs/ + ~/.cache/hardhat-nodejs/ + key: contracts-${{ hashFiles('packages/*/contracts/**/*.sol') }} + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build contracts + run: yarn compile:cached + + - name: Configure k8s + run: .github/scripts/kubectl-config.sh ${{secrets.KUBE_CA}} ${{secrets.KUBE_SERVER}} ${{secrets.KUBE_TOKEN}} + + - name: Deploy rinkeby + if: github.ref == 'refs/heads/develop' + run: yarn deploy:subgraph:rinkeby + + - name: Deploy rinkeby staging + if: github.ref == 'refs/heads/develop' + run: yarn deploy:subgraph:rinkeby:staging + + - name: Deploy mainnet + if: github.ref == 'refs/heads/master' + run: yarn deploy:subgraph:mainnet diff --git a/.husky/_/husky.sh b/.husky/_/husky.sh new file mode 100644 index 000000000..ca2720e08 --- /dev/null +++ b/.husky/_/husky.sh @@ -0,0 +1,30 @@ +#!/bin/sh +if [ -z "$husky_skip_init" ]; then + debug () { + [ "$HUSKY_DEBUG" = "1" ] && echo "husky (debug) - $1" + } + + readonly hook_name="$(basename "$0")" + debug "starting $hook_name..." + + if [ "$HUSKY" = "0" ]; then + debug "HUSKY env variable is set to 0, skipping hook" + exit 0 + fi + + if [ -f ~/.huskyrc ]; then + debug "sourcing ~/.huskyrc" + . ~/.huskyrc + fi + + export readonly husky_skip_init=1 + sh -e "$0" "$@" + exitCode="$?" + + if [ $exitCode != 0 ]; then + echo "husky - $hook_name hook exited with code $exitCode (error)" + exit $exitCode + fi + + exit 0 +fi diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..0c0c237c4 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +lerna --scope=@aragon/govern-console run precommit \ No newline at end of file diff --git a/README.md b/README.md index b8f2188cb..7f4c5e6db 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,7 @@ [![](https://img.shields.io/discord/672466989217873929?label=discord)](https://discord.gg/aKAKcf) [![](https://img.shields.io/npm/v/@aragon/govern-core)](https://www.npmjs.com/package/@aragon/govern-core) [![](https://img.shields.io/badge/solidity-%3E%3D%200.6.8-lightgrey)](https://img.shields.io/badge/solidity-%3E%3D%200.6.8-lightgrey) [![Actions Status](https://github.com/aragon/govern/workflows/CI/badge.svg)](https://github.com/aragon/govern/actions?query=workflow%3ACI) [![Actions Status](https://github.com/aragon/govern/workflows/CD/badge.svg)](https://github.com/aragon/govern/actions?query=workflow%3ACD) - [![codecov](https://codecov.io/gh/aragon/govern/branch/master/graph/badge.svg)](https://codecov.io/gh/aragon/govern) - +[![codecov](https://codecov.io/gh/aragon/govern/branch/master/graph/badge.svg)](https://codecov.io/gh/aragon/govern) ## Aragon Govern @@ -33,6 +32,15 @@ The code in this repository has **not** been audited. Read the documentation if you have any doubts about the high-level overview of Govern, or if you want to know more about how everything works under the hood. #### 👋 Get started contributing with a [good first issue](https://github.com/aragon/govern/labels/good%20first%20issue%20%F0%9F%8C%9E) + +Before explaining how you can contribute, It's worth mentioning that we use `develop` branch as the default one. This makes it easier for us to +have all the latest, development changes without affecting the current production version. Though, We don't use `release` branches to make the process a little bit easier ! + +- Pushing to `develop` branch via PR deploys changes to testing environments(currently only rinkeby). +- Pushing to `master` branch via PR from `develop` deploys changes to production servers(mainnet). +- Pushing to `master|develop` directly will be restricted to make sure the PR's are reviewed. +- Creating PRs end up in relation to `develop` by default. + Don't be shy to contribute even the smallest tweak. Everyone will be especially nice and helpful to beginners to help you get started! ## Structure @@ -55,16 +63,15 @@ To use Govern, feel free to deploy your own registries and factories, but using #### Mainnet -- 📜 GovernRegistry: [`0x9dDC0BAB6aCCa5F374E2C21708b3107e5E973601`](https://etherscan.io/address/0x9dDC0BAB6aCCa5F374E2C21708b3107e5E973601) -- 🏭 GovernBaseFactory: [`0x3B02e7C7Af1be87BBEc071f5DFfcdD8613154bA9`](https://etherscan.io/address/0x3B02e7C7Af1be87BBEc071f5DFfcdD8613154bA9) +- 📜 GovernRegistry: [`0xf2b7D096cd34F228A6413e276132C21D98b19882`](https://etherscan.io/address/0xf2b7D096cd34F228A6413e276132C21D98b19882) +- 🏭 GovernBaseFactory: [`0x8bF05ce17B30f8C73B06e49f67076f944687c967`](https://etherscan.io/address/0x8bF05ce17B30f8C73B06e49f67076f944687c967) #### Rinkeby -- 📜 GovernRegistry: [`0x8adf949adbab3614f5340b21d9d9ad928d218096`](https://rinkeby.etherscan.io/address/0x8adf949adbab3614f5340b21d9d9ad928d218096) -- 🏭 GovernBaseFactory: [`0x1791E1D949c21703f49FC2C9a24570FA72ed62Ae`](https://rinkeby.etherscan.io/address/0x1791E1D949c21703f49FC2C9a24570FA72ed62Ae) +- 📜 GovernRegistry: [`0xf46253ef29FaedAbf63AA8cA6c0A41CbbdC93948`](https://rinkeby.etherscan.io/address/0xf46253ef29FaedAbf63AA8cA6c0A41CbbdC93948) +- 🏭 GovernBaseFactory: [`0x46013753f3a02ab4239cA936632E6C6B39235CCE`](https://rinkeby.etherscan.io/address/0x46013753f3a02ab4239cA936632E6C6B39235CCE) ## Help shape Aragon Govern + - Discuss in [Aragon Forum](https://forum.aragon.org/tags/aragon-govern) - Join the [Aragon Govern channel](https://discord.gg/DrKMbeY) on Discord. - - diff --git a/deployments/mainnet/evm-dev-preview.md b/deployments/mainnet/evm-dev-preview.md index 0be151b54..58efc3365 100644 --- a/deployments/mainnet/evm-dev-preview.md +++ b/deployments/mainnet/evm-dev-preview.md @@ -1,8 +1,10 @@ # Developer Preview (EVM, Mainnet) --- + - Deployer: [@izqui](https://github.com/izqui) ([`0x1111a5f9decc25927037de55d2013d7ad30f1af0`](https://etherscan.io/address/0x1111a5f9decc25927037de55d2013d7ad30f1af0) - Commit hash: [`a26d0f07`](https://github.com/aragon/govern/commit/a26d0f073b70839f5182abbace2aef1dd1918b51) + --- ## Registry @@ -48,5 +50,3 @@ A wild new Govern named *M* appeared 🦅 - Queue: https://etherscan.io/address/0x498CbF401DF68196dc41b4Bf53817088cB70B815 ✨ Done in 61.40s. ``` - - diff --git a/deployments/rinkeby/evm-dev-preview.md b/deployments/rinkeby/evm-dev-preview.md index e1da6d092..b646b3a19 100644 --- a/deployments/rinkeby/evm-dev-preview.md +++ b/deployments/rinkeby/evm-dev-preview.md @@ -1,8 +1,10 @@ # Developer Preview (EVM, Rinkeby) --- + - Deployer: [@izqui](https://github.com/izqui) ([`0x1111a5f9decc25927037de55d2013d7ad30f1af0`](https://rinkeby.etherscan.io/address/0x1111a5f9decc25927037de55d2013d7ad30f1af0) - Commit hash: [`a26d0f07`](https://github.com/aragon/govern/commit/a26d0f073b70839f5182abbace2aef1dd1918b51) + --- ## Registry @@ -48,5 +50,3 @@ A wild new Govern named *autonomous-olive* appeared 🦅 - Queue: https://rinkeby.etherscan.io/address/0x111b5feb00f7ce0fC1fD84E399cE4DCF695A0a08 ✨ Done in 141.99s. ``` - - diff --git a/docs/README.md b/docs/README.md index 7bdcbc835..25884147d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,12 +10,7 @@ Aragon Govern is software for creating and governing organizations such as DeFi Along with off-chain voting solutions like [Snapshot](https://snapshot.page/) it allows you to _govern_ all parts of your project, even if not completely decentralized, in an easy manner. also allowing for flexibility and extensions when needed. -* The [**Overview**](guides/core-concepts.md) section provides more insight over Govern and all of its tooling. -* The [**Developers**](developers/getting-started.md) section gives an overview of all the individual pieces of Govern. +- The [**Overview**](guides/core-concepts.md) section provides more insight over Govern and all of its tooling. +- The [**Developers**](developers/getting-started.md) section gives an overview of all the individual pieces of Govern. If you have any questions or you'd like to say hi, come join the community at [Discord](https://discord.com/invite/aragon)! - - - - - diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 5c5a258ff..ce4f87796 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,19 +1,19 @@ # Table of contents -* [Introduction](README.md) +- [Introduction](README.md) ## Overview -* [ERC3000](guides/erc3000.md) -* [Core concepts](guides/core-concepts.md) +- [ERC3000](guides/erc3000.md) +- [Core concepts](guides/core-concepts.md) ## Developers -* [Getting started](developers/getting-started.md) -* [Smart contracts breakdown](developers/smart-contracts.md) -* [Govern JS API](developers/govern-js.md) -* [Govern Server API](developers/server-api.md) +- [Getting started](developers/getting-started.md) +- [Smart contracts breakdown](developers/smart-contracts.md) +- [Govern JS API](developers/govern-js.md) +- [Govern Server API](developers/server-api.md) ## Internal -* [Historical deployments](developers/historical-deployments.md) +- [Historical deployments](developers/historical-deployments.md) diff --git a/docs/developers/govern-js.md b/docs/developers/govern-js.md index 86d1822ab..ff927a4a9 100644 --- a/docs/developers/govern-js.md +++ b/docs/developers/govern-js.md @@ -4,81 +4,104 @@ > The default config uses the Govern servers deployed by Aragon -``` javascript +```javascript import { dao } from '@aragon/govern' -const response = await dao('0x0...'); +const response = await dao('0x0...') console.log(response) ``` **Usage with custom config** -``` javascript + +```javascript import { dao, configure } from '@aragon/govern' -configure({governURL: 'https://myOwnGovernServer.io'}); +configure({ governURL: 'https://myOwnGovernServer.io' }) -const response = await dao('0x0...'); +const response = await dao('0x0...') console.log(response) ``` -### dao(name) ⇒ ``Promise`` +### dao(name) ⇒ `Promise` Returns details about a DAO by his address. -| Param | Type | Description | -| ------ | --------------------- | ----------------------------------------- | -| name | string | The name of the DAO | +| Param | Type | Description | +| ----- | ------------------- | ------------------- | +| name | string | The name of the DAO | Example: -``` typescript + +```typescript import { dao } from '@aragon/govern' -const response = await dao('0x0...'); +const response = await dao('0x0...') ``` -### daos() ⇒ ``Promise`` +### daos() ⇒ `Promise` Returns all DAOs. - Example: -``` typescript + +```typescript import { daos } from '@aragon/govern' -const response = await daos(); +const response = await daos() ``` -### query(query, args) ⇒ ``Promise`` +### query(query, args) ⇒ `Promise` Returns the desired data. -| Param | Type | Description | -| ------ | ------------------------- | ----------------------------------------- | -| query | string | GraphQL query | -| args | object | Object with parameters | +| Param | Type | Description | +| ----- | ------------------- | ---------------------- | +| query | string | GraphQL query | +| args | object | Object with parameters | Example: -``` typescript + +```typescript import { query } from '@aragon/govern' const query = await query(myQuery, {...}); ``` -### configure(config) ⇒ ``void`` +### createDao(args, options) ⇒ `Promise` + +Create + +| Param | Type | Description | +| ------- | ----------------------------- | -------------------------------------- | +| args | CreateDaoParams | Dao name, Dao token, useProxies option | +| options | CreateDaoOptions | EIP 1193 provider, Dao factory address | + +Examples: + +For Node.js: + +```typescript +import { createDao } from '@aragon/govern' + +const result = await createDao(args, options) +``` + +### configure(config) ⇒ `void` Overwrites the default configuration of govern. -| Param | Type | Description | -| ------ | ------------------------------------------------------- | ---------------------------------------------------- | -| config | [ConfigurationObject][ConfigurationObject] | Object with all [config options][ConfigurationObject]| +| Param | Type | Description | +| ------ | ------------------------------------------------------- | ----------------------------------------------------- | +| config | [ConfigurationObject][configurationobject] | Object with all [config options][configurationobject] | Example: -``` typescript + +```typescript import { configure } from '@aragon/govern' -configure({governURL: 'https://myOwnGovernServer.io'}); +configure({ governURL: 'https://myOwnGovernServer.io' }) ``` -[ConfigurationObject]: https://github.com/aragon/govern/tree/master/packages/govern/internal/configuration/Configuration.ts#L4 +[configurationobject]: https://github.com/aragon/govern/tree/master/packages/govern/internal/configuration/Configuration.ts#L4 diff --git a/docs/developers/smart-contracts.md b/docs/developers/smart-contracts.md index 1a4aefdec..349d52a27 100644 --- a/docs/developers/smart-contracts.md +++ b/docs/developers/smart-contracts.md @@ -18,15 +18,14 @@ ERC3000 specific contracts haven't been included here. To browse them, go to the The `ERC3000Registry` contract serves as the **central registry for all Govern DAOs**. Every DAO spawned through a properly-implemented `GovernFactory` will register the new DAO in the "official" registry. The registry takes care of doing these things: -* Keep track\* of every `Govern` ⟷ `GovernQueue` pair assigning it a name on the blockchain. This means that instead of assigning an ENS name, this is left to the user, as the name itself will be saved in the contract's storage. -* Setting metadata, which means you can include an IPFS CID to talk about your DAO, and include relevant links. +- Keep track\* of every `Govern` ⟷ `GovernQueue` pair assigning it a name on the blockchain. This means that instead of assigning an ENS name, this is left to the user, as the name itself will be saved in the contract's storage. +- Setting metadata, which means you can include an IPFS CID to talk about your DAO, and include relevant links. **Think of it as...** A book which keeps track of every DAO and its core relevant info, which will be accessible through a subgraph. -{% hint style="info" %} -\* Due to the stateless nature of these contracts, it actually only emits an event, and registers the DAO name to the contract's storage so it cannot be overwritten. We rely on the subgraph to get this information. +{% hint style="info" %} \* Due to the stateless nature of these contracts, it actually only emits an event, and registers the DAO name to the contract's storage so it cannot be overwritten. We rely on the subgraph to get this information. {% endhint %} ### GovernFactory.sol & GovernQueueFactory.sol @@ -85,8 +84,7 @@ Actions can be **vetoed**, which might be useful for projects which are venturin The ACL from govern is a much leaner implementation of the original ACL from aragonOS, but still very powerful, having the ability to grant, revoke, and freeze roles. There are a couple of differences: -* Is devised to be as an **inheritable** contract. Instead of being a single contract that binds the whole organization together, **both `GovernQueue` and `Govern` have their own ACLs**. -* It has a handy **bulk** function to set multiple permissions at once. -* The address for freezing a role is `0x0000000000000000000000000000000000000001`. -* The address for giving the permission to everyone is`0xffffffffffffffffffffffffffffffffffffffff` - +- Is devised to be as an **inheritable** contract. Instead of being a single contract that binds the whole organization together, **both `GovernQueue` and `Govern` have their own ACLs**. +- It has a handy **bulk** function to set multiple permissions at once. +- The address for freezing a role is `0x0000000000000000000000000000000000000001`. +- The address for giving the permission to everyone is`0xffffffffffffffffffffffffffffffffffffffff` diff --git a/docs/guides/core-concepts.md b/docs/guides/core-concepts.md index 9ce127d7f..3e015ba6d 100644 --- a/docs/guides/core-concepts.md +++ b/docs/guides/core-concepts.md @@ -12,8 +12,8 @@ To date, acceptable actions and behavioral boundaries within DAOs are rigidly de A Govern DAO, in its most normal and basic form has two key pieces: -* An Action Queue -* An Executor +- An Action Queue +- An Executor Govern's Action Queue is what most users will interact with directly—it holds the DAOs configuration parameters, and its where actors can schedule, execute, veto and challenge actions. It's also flexible, meaning that actions can be introduced to tweak its own parameters on the fly. @@ -22,4 +22,3 @@ Through the Executor, Govern DAOs can also hold funds and interact with any arbi Learn more about the [smart contract system here](../developers/smart-contracts.md). Govern will also have first class support with Snapshot, in which a space will be able to be configured so that every proposal can attach an on-chain action to the corresponding options to vote for. With these tools, we have everything we need to allow a project, to fully and progressively decentralize and take decisions over its future in a community-oriented manner. - diff --git a/docs/guides/erc3000.md b/docs/guides/erc3000.md index 0615d9d27..3f980938f 100644 --- a/docs/guides/erc3000.md +++ b/docs/guides/erc3000.md @@ -16,7 +16,6 @@ Balancer, in response to rising gas prices, built [Snapshot](https://docs.snapsh ERC-3000 presents a basic on-chain spec for contracts to optimistically enact governance decisions made off-chain. Backed by [Aragon](https://aragon.org) & [Balancer](https://balancer.finance), it's an attempt to standardize the design and writing of governance tools to introduce a high level of composability and compatibility between them. -The standard is opinionated in defining the 6 entrypoint functions to contracts supporting the standard. But it allows for any sort of resolver mechanism for the challenge/response games characteristic of optimistic contracts. +The standard is opinionated in defining the 6 entrypoint functions to contracts supporting the standard. But it allows for any sort of resolver mechanism for the challenge/response games characteristic of optimistic contracts. While the authors \(Jorge Izquierdo from Aragon and Fabien Marino from Balancer\) currently believe resolving challenges [using a subjective oracle](https://aragon.org/blog/snapshot) is the right tradeoff, the standard has been designed such that changing to another mechanism is possible \(a deterministic resolver like [Optimism’s OVM](https://optimism.io) uses\), even allowing to hot-swap it in the same live instance. - diff --git a/package.json b/package.json index fa5b1a2e0..b5b4ae24b 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ ], "license": "GPL-3.0", "devDependencies": { - "lerna": "^3.22.1" + "lerna": "^3.22.1", + "husky": "^6.0.0" }, "scripts": { "clean": "lerna run --scope=@aragon/govern* --stream clean", @@ -25,6 +26,7 @@ "compile:cached": "lerna run --stream compile:cached", "build:subgraph": "lerna run --scope=@aragon/govern-subgraph --stream build", "deploy:subgraph:rinkeby": "lerna run --scope=@aragon/govern-subgraph --stream deploy-rinkeby", + "deploy:subgraph:rinkeby:staging": "lerna run --scope=@aragon/govern-subgraph --stream deploy-rinkeby-staging", "deploy:subgraph:mainnet": "lerna run --scope=@aragon/govern-subgraph --stream deploy-mainnet" }, "workspaces": { diff --git a/packages/erc3k/.solcover.js b/packages/erc3k/.solcover.js index 6d4e365b3..614904193 100644 --- a/packages/erc3k/.solcover.js +++ b/packages/erc3k/.solcover.js @@ -1,6 +1,6 @@ module.exports = { mocha: { - grep: "@skip-on-coverage", // Find everything with this tag - invert: true // Run the grep's inverse set. - } + grep: '@skip-on-coverage', // Find everything with this tag + invert: true, // Run the grep's inverse set. + }, } diff --git a/packages/erc3k/contracts/ERC3000Data.sol b/packages/erc3k/contracts/ERC3000Data.sol index 1d2c21b4e..6fd8b4f9a 100644 --- a/packages/erc3k/contracts/ERC3000Data.sol +++ b/packages/erc3k/contracts/ERC3000Data.sol @@ -32,11 +32,12 @@ library ERC3000Data { } struct Config { - uint256 executionDelay; - Collateral scheduleDeposit; - Collateral challengeDeposit; - address resolver; - bytes rules; + uint256 executionDelay; // how many seconds to wait before being able to call `execute`. + Collateral scheduleDeposit; // fees for scheduling + Collateral challengeDeposit; // fees for challenging + address resolver; // resolver that will rule the disputes + bytes rules; // rules of how DAO should be managed + uint256 maxCalldataSize; // max calldatasize for the schedule } struct Collateral { diff --git a/packages/erc3k/contracts/IERC3000Registry.sol b/packages/erc3k/contracts/IERC3000Registry.sol index fc920c650..17ff3e95a 100644 --- a/packages/erc3k/contracts/IERC3000Registry.sol +++ b/packages/erc3k/contracts/IERC3000Registry.sol @@ -18,8 +18,8 @@ abstract contract IERC3000Registry { * @param token Governance token of the DAO * @param initialMetadata Additional data to store for this DAO */ - function register(IERC3000Executor executor, IERC3000 queue, IERC20 token, string calldata name, bytes calldata initialMetadata) virtual external; - event Registered(IERC3000Executor indexed executor, IERC3000 queue, IERC20 indexed token, address indexed registrant, string name); + function register(IERC3000Executor executor, IERC3000 queue, IERC20 token, address minter, string calldata name, bytes calldata initialMetadata) virtual external; + event Registered(IERC3000Executor indexed executor, IERC3000 queue, IERC20 indexed token, address minter, address indexed registrant, string name); /** * @notice Sets or updates the metadata of a DAO diff --git a/packages/erc3k/test/erc3k-data.test.ts b/packages/erc3k/test/erc3k-data.test.ts index 24d71c5ed..d83aedaab 100644 --- a/packages/erc3k/test/erc3k-data.test.ts +++ b/packages/erc3k/test/erc3k-data.test.ts @@ -2,92 +2,27 @@ import { ethers } from 'hardhat' import { expect } from 'chai' import { keccak256, defaultAbiCoder, solidityPack } from 'ethers/lib/utils' import { ERC3000DataLibTest, ERC3000DataLibTest__factory } from '../typechain' +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' +import { getConfigHash, getPayloadHash } from '../utils/ERC3000' -let deposit = { - token: '0xb794f5ea0ba39494ce839613fffba74279579268', - amount: 1000, +let container = { + config: ERC3000DefaultConfig, + payload: { + nonce: 1, + executionTime: 1000, + submitter: '0xb794f5ea0ba39494ce839613fffba74279579268', + executor: '0xb794f5ea0ba39494ce839613fffba74279579268', + actions: [ + { + to: '0xb794f5ea0ba39494ce839613fffba74279579268', + value: 1000, + data: '0x00', + }, + ], + allowFailuresMap: + '0x0000000000000000000000000000000000000000000000000000000000000000', + proof: '0x00', }, - container = { - config: { - executionDelay: 1000, - scheduleDeposit: deposit, - challengeDeposit: deposit, - resolver: '0xb794f5ea0ba39494ce839613fffba74279579268', - rules: '0x00', - }, - payload: { - nonce: 1, - executionTime: 1000, - submitter: '0xb794f5ea0ba39494ce839613fffba74279579268', - executor: '0xb794f5ea0ba39494ce839613fffba74279579268', - actions: [ - { - to: '0xb794f5ea0ba39494ce839613fffba74279579268', - value: 1000, - data: '0x00', - }, - ], - allowFailuresMap: - '0x0000000000000000000000000000000000000000000000000000000000000000', - proof: '0x00', - }, - } - -function getPayloadHash(): string { - return keccak256( - defaultAbiCoder.encode( - [ - 'tuple(' + - 'uint256 nonce, ' + - 'uint256 executionTime, ' + - 'address submitter, ' + - 'address executor, ' + - 'bytes32 actionHash, ' + - 'bytes32 allowFailuresMap, ' + - 'bytes32 proofBytes' + - ')', - ], - [ - { - nonce: container.payload.nonce, - executionTime: container.payload.executionTime, - submitter: container.payload.submitter, - executor: container.payload.executor, - actionHash: keccak256( - defaultAbiCoder.encode( - [ - 'tuple(' + - 'address to, ' + - 'uint256 value, ' + - 'bytes data' + - ')[]', - ], - [container.payload.actions] - ) - ), - allowFailuresMap: container.payload.allowFailuresMap, - proofBytes: keccak256(container.payload.proof), - } - ] - ) - ) -} - -function getConfigHash(): string { - return keccak256( - defaultAbiCoder.encode( - [ - 'tuple(' + - 'uint256 executionDelay, ' + - 'tuple(address token, uint256 amount) scheduleDeposit, ' + - 'tuple(address token, uint256 amount) challengeDeposit, ' + - 'address resolver, ' + - 'bytes rules' + - ')', - ], - [container.config] - ) - ) } describe('ERC3000Data', function () { @@ -105,17 +40,17 @@ describe('ERC3000Data', function () { it('calls testConfigHash and returns the expected hash', async () => { expect(await erc3kDataLib.testConfigHash(container.config)).to.be.equal( - getConfigHash() + getConfigHash(container.config) ) }) it('calls testPayloadHash and returns the expected hash', async () => { expect(await erc3kDataLib.testPayloadHash(container.payload)).to.be.equal( - getPayloadHash() + getPayloadHash(container) ) }) - it('calls testContainerHash and returns the expected hash [ @skip-on-coverage ]', async () => { + it('calls testContainerHash and returns the expected hash', async () => { expect(await erc3kDataLib.testContainerHash(container)).to.be.equal( keccak256( solidityPack( @@ -124,8 +59,8 @@ describe('ERC3000Data', function () { 'erc3k-v1', erc3kDataLib.address, chainId, - getPayloadHash(), - getConfigHash(), + getPayloadHash(container), + getConfigHash(container.config), ] ) ) diff --git a/packages/govern-core/test/pipelines/helpers.ts b/packages/erc3k/utils/ERC3000.ts similarity index 52% rename from packages/govern-core/test/pipelines/helpers.ts rename to packages/erc3k/utils/ERC3000.ts index f33154495..bff45c0e3 100644 --- a/packages/govern-core/test/pipelines/helpers.ts +++ b/packages/erc3k/utils/ERC3000.ts @@ -1,5 +1,20 @@ import { keccak256, defaultAbiCoder, solidityPack } from 'ethers/lib/utils' +export const ERC3000DefaultConfig = { + executionDelay: 3600, // how many seconds to wait before being able to call `execute`. + scheduleDeposit: { + token: `0x${'00'.repeat(20)}`, + amount: 0, + }, + challengeDeposit: { + token: `0x${'00'.repeat(20)}`, + amount: 0, + }, + resolver: `0x${'00'.repeat(20)}`, + rules: '0x', + maxCalldataSize: 100000, // initial maxCalldatasize +} + /** * Returns the hash of the container payload * @@ -28,10 +43,10 @@ export function getPayloadHash(container: any): string { defaultAbiCoder.encode( [ 'tuple(' + - 'address to, ' + - 'uint256 value, ' + - 'bytes data' + - ')[]', + 'address to, ' + + 'uint256 value, ' + + 'bytes data' + + ')[]', ], [container.payload.actions] ) @@ -50,19 +65,20 @@ export function getPayloadHash(container: any): string { * * @returns {string} */ -export function getConfigHash(container: any): string { +export function getConfigHash(config: any): string { return keccak256( defaultAbiCoder.encode( [ 'tuple(' + - 'uint256 executionDelay, ' + - 'tuple(address token, uint256 amount) scheduleDeposit, ' + - 'tuple(address token, uint256 amount) challengeDeposit, ' + - 'address resolver, ' + - 'bytes rules' + - ')', + 'uint256 executionDelay, ' + + 'tuple(address token, uint256 amount) scheduleDeposit, ' + + 'tuple(address token, uint256 amount) challengeDeposit, ' + + 'address resolver, ' + + 'bytes rules, ' + + 'uint256 maxCalldataSize' + + ')', ], - [container.config] + [config] ) ) } @@ -76,11 +92,21 @@ export function getConfigHash(container: any): string { * * @returns {string} */ -export function getContainerHash(container: any, address: string, chainId: number): string { +export function getContainerHash( + container: any, + address: string, + chainId: number +): string { return keccak256( solidityPack( ['string', 'address', 'uint', 'bytes32', 'bytes32'], - ['erc3k-v1', address, chainId, getPayloadHash(container), getConfigHash(container)] + [ + 'erc3k-v1', + address, + chainId, + getPayloadHash(container), + getConfigHash(container.config), + ] ) ) } @@ -97,35 +123,34 @@ export function getEncodedContainer(container: any): string { [ 'tuple(' + 'tuple(' + - 'uint256 nonce, ' + - 'uint256 executionTime, ' + - 'address submitter, ' + - 'address executor, ' + - 'tuple(' + - 'address to, ' + - 'uint256 value, ' + - 'bytes data' + - ')[] actions, ' + - 'bytes32 allowFailuresMap, ' + - 'bytes proof' + + 'uint256 nonce, ' + + 'uint256 executionTime, ' + + 'address submitter, ' + + 'address executor, ' + + 'tuple(' + + 'address to, ' + + 'uint256 value, ' + + 'bytes data' + + ')[] actions, ' + + 'bytes32 allowFailuresMap, ' + + 'bytes proof' + ') payload, ' + 'tuple(' + - 'uint256 executionDelay, ' + - 'tuple(' + - 'address token, ' + - 'uint256 amount' + - ') scheduleDeposit, ' + - 'tuple(' + - 'address token, ' + - 'uint256 amount' + - ') challengeDeposit, ' + - 'address resolver, ' + - 'bytes rules' + + 'uint256 executionDelay, ' + + 'tuple(' + + 'address token, ' + + 'uint256 amount' + + ') scheduleDeposit, ' + + 'tuple(' + + 'address token, ' + + 'uint256 amount' + + ') challengeDeposit, ' + + 'address resolver, ' + + 'bytes rules, ' + + 'uint256 maxCalldataSize' + ') config' + - ')' + ')', ], - [ - container - ] - ); -} \ No newline at end of file + [container] + ) +} diff --git a/packages/govern-console/.babelrc b/packages/govern-console/.babelrc new file mode 100644 index 000000000..d81e57627 --- /dev/null +++ b/packages/govern-console/.babelrc @@ -0,0 +1,4 @@ +{ + "plugins": [["styled-components", { "displayName": true }]] +} + diff --git a/packages/govern-console/.eslintrc.js b/packages/govern-console/.eslintrc.js deleted file mode 100644 index 29add9b8d..000000000 --- a/packages/govern-console/.eslintrc.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - env: { - browser: true, - es6: true, - }, - extends: [ - 'eslint:recommended', - 'plugin:prettier/recommended', - 'plugin:@typescript-eslint/recommended', - 'prettier/@typescript-eslint', - 'react-app', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - jsx: true, - sourceType: 'module', - project: './tsconfig.json', - }, - plugins: ['prettier', 'react', 'react-hooks', '@typescript-eslint'], - rules: { - '@typescript-eslint/no-explicit-any': 'off', - 'no-use-before-define': 'off', - '@typescript-eslint/no-use-before-define': ['error'], - '@typescript-eslint/ban-ts-comment': 'off', - }, -} diff --git a/packages/govern-console/.eslintrc.json b/packages/govern-console/.eslintrc.json new file mode 100644 index 000000000..caabd292a --- /dev/null +++ b/packages/govern-console/.eslintrc.json @@ -0,0 +1,35 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + // Allows for the parsing of JSX + "jsx": true + } + }, + "ignorePatterns": ["node_modules/**/*"], + "settings": { + "react": { + "version": "detect" + } + }, + "extends": [ + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + "prettier/@typescript-eslint", + "plugin:prettier/recommended" + ], + "rules": { + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "prettier/prettier": "error", + "@typescript-eslint/no-explicit-any": "off", + "react/prop-types": "off", + // next two rules can not be turned on for react-script, so we set them off for lint + "react/react-in-jsx-scope": "off", + "react/no-unescaped-entities": "off" + } +} diff --git a/packages/govern-console/.gitignore b/packages/govern-console/.gitignore index 6ad1b6407..23cc8fd76 100644 --- a/packages/govern-console/.gitignore +++ b/packages/govern-console/.gitignore @@ -8,9 +8,11 @@ # testing /coverage +/public/aragon-ui +/storybook-static + # production /build -/public/aragon-ui # misc .DS_Store @@ -22,7 +24,3 @@ npm-debug.log* yarn-debug.log* yarn-error.log* - -.vercel - -.eslintcache diff --git a/packages/govern-console/.prettierrc b/packages/govern-console/.prettierrc.json similarity index 50% rename from packages/govern-console/.prettierrc rename to packages/govern-console/.prettierrc.json index 97b711153..ca8527e0d 100644 --- a/packages/govern-console/.prettierrc +++ b/packages/govern-console/.prettierrc.json @@ -1,6 +1,7 @@ { - "semi": false, - "singleQuote": true, + "semi": true, "trailingComma": "all", - "arrowParens": "avoid" + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2 } diff --git a/packages/govern-console/LICENSE b/packages/govern-console/LICENSE new file mode 100644 index 000000000..febeec1eb --- /dev/null +++ b/packages/govern-console/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Aragon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/govern-console/README.md b/packages/govern-console/README.md index 8deaa2331..b58e0af83 100644 --- a/packages/govern-console/README.md +++ b/packages/govern-console/README.md @@ -1,16 +1,46 @@ -![Aragon Govern header](../../raw/master/.github/govern.png) +# Getting Started with Create React App -[![](https://img.shields.io/discord/672466989217873929?label=discord)](https://discord.gg/aKAKcf) [![](https://img.shields.io/npm/v/@aragon/govern)](https://www.npmjs.com/package/@aragon/govern) [![](https://img.shields.io/badge/solidity-%3E%3D%200.6.8-lightgrey)](https://img.shields.io/badge/solidity-%3E%3D%200.6.8-lightgrey) [![Actions Status](https://github.com/aragon/govern/workflows/CI/badge.svg)](https://github.com/aragon/govern/actions?query=workflow%3ACI) [![Actions Status](https://github.com/aragon/govern/workflows/CD/badge.svg)](https://github.com/aragon/govern/actions?query=workflow%3ACD) -[![codecov](https://codecov.io/gh/aragon/govern/branch/master/graph/badge.svg)](https://codecov.io/gh/aragon/govern) +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). -## Govern Console +## Available Scripts -Govern Console is a minimal frontend to manage your optimistic DAO. You'll be able to manage your DAO configuration, permissions, and actions currently in the queue. +In the project directory, you can run: -## Quick start +### `yarn start` -Install with yarn and launch the app with yarn start. By default, the app is configured to connect to the Ethereum Rinkeby testnet, but there's a chain selector so you can change them on the fly. +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. -## Contributing +The page will reload if you make edits.\ +You will also see any lint errors in the console. -Don't be shy to contribute even the smallest tweak. 🐲 There are still some dragons to be aware of, but we'll be here to help you get started! +### `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/govern-console/config-overrides.js b/packages/govern-console/config-overrides.js new file mode 100644 index 000000000..703640785 --- /dev/null +++ b/packages/govern-console/config-overrides.js @@ -0,0 +1,4 @@ +// Use a custom babel configuration with CRA +const { useBabelRc, override } = require('customize-cra') + +module.exports = override(useBabelRc()) diff --git a/packages/govern-console/decs.d.ts b/packages/govern-console/decs.d.ts new file mode 100644 index 000000000..feeff41cc --- /dev/null +++ b/packages/govern-console/decs.d.ts @@ -0,0 +1 @@ +declare module '@aragon/ui'; diff --git a/packages/govern-console/fleek/console.mainnet.json b/packages/govern-console/fleek/console.mainnet.json new file mode 100644 index 000000000..e5c249e80 --- /dev/null +++ b/packages/govern-console/fleek/console.mainnet.json @@ -0,0 +1,14 @@ +{ + "site": { + "id": "f927d81c-d942-4630-8858-550542a401d5", + "team": "aragonone-team", + "platform": "ipfs", + "source": "ipfs", + "name": "muddy-pond-3573" + }, + "build": { + "baseDir": "", + "publicDir": "build", + "rootDir": "" + } +} \ No newline at end of file diff --git a/packages/govern-console/fleek/console.rinkeby.json b/packages/govern-console/fleek/console.rinkeby.json new file mode 100644 index 000000000..ab11a827d --- /dev/null +++ b/packages/govern-console/fleek/console.rinkeby.json @@ -0,0 +1,14 @@ +{ + "site": { + "id": "15a86cf1-2b97-4c1d-bd70-349a5a60daad", + "team": "aragonone-team", + "platform": "ipfs", + "source": "ipfs", + "name": "dark-butterfly-6166" + }, + "build": { + "baseDir": "", + "publicDir": "build", + "rootDir": "" + } +} diff --git a/packages/govern-console/fleek/console.rinkeby.staging.json b/packages/govern-console/fleek/console.rinkeby.staging.json new file mode 100644 index 000000000..cb083783b --- /dev/null +++ b/packages/govern-console/fleek/console.rinkeby.staging.json @@ -0,0 +1,14 @@ +{ + "site": { + "id": "0bc1e603-dcaf-4f95-8a2c-d28713c3ccd1", + "team": "aragonone-team", + "platform": "ipfs", + "source": "ipfs", + "name": "purple-unit-3967" + }, + "build": { + "baseDir": "", + "publicDir": "build", + "rootDir": "" + } +} diff --git a/packages/govern-console/overrides-mui.d.ts b/packages/govern-console/overrides-mui.d.ts new file mode 100644 index 000000000..ea35eaa3e --- /dev/null +++ b/packages/govern-console/overrides-mui.d.ts @@ -0,0 +1,13 @@ +// Added for DatePicker customization functionality +// https://material-ui-pickers.dev/guides/css-overrides#typescript + +import { Overrides } from '@material-ui/core/styles/overrides'; +import { MuiPickersOverrides } from '@material-ui/pickers/typings/overrides'; + +type overridesNameToClassKey = { + [P in keyof MuiPickersOverrides]: keyof MuiPickersOverrides[P]; +}; + +declare module '@material-ui/core/styles/overrides' { + export interface ComponentNameToClassKey extends overridesNameToClassKey {} +} diff --git a/packages/govern-console/package.json b/packages/govern-console/package.json index 4d5e16edd..4249e4502 100644 --- a/packages/govern-console/package.json +++ b/packages/govern-console/package.json @@ -1,38 +1,85 @@ { "name": "@aragon/govern-console", - "homepage": "./", - "version": "1.0.0-beta.12", + "version": "0.1.0", + "private": true, "dependencies": { - "axios": "^0.21.0", - "bn.js": "^5.1.3", - "clipboard-polyfill": "^3.0.1", - "date-fns": "^2.16.1", - "eslint-config-react-app": "^6.0.0", - "ethers": "^5.0.14", - "graphql": "^15.0.0", - "graphql-request": "^3.3.0", - "is-ipfs": "^2.0.0", - "react": "16.13.1", - "react-dom": "16.13.1", - "react-query": "^2.26.2", + "@apollo/client": "^3.3.14", + "@aragon/govern": "^1.0.0-beta.12", + "@aragon/ui": "https://github.com/aragon/ui.git#v2", + "@date-io/moment": "^1.3.13", + "@material-ui/core": "^4.11.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/pickers": "^3.3.10", + "@metamask/detect-provider": "^1.2.0", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "@types/jest": "^26.0.15", + "@types/node": "^12.0.0", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@types/react-router": "^5.1.12", + "@types/react-router-dom": "^5.1.7", + "@types/styled-components": "^5.1.7", + "@web3-react/core": "^6.1.9", + "@web3-react/injected-connector": "^6.0.7", + "cids": "^1.1.6", + "date-fns": "^2.21.3", + "eslint-config-airbnb": "^18.2.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-react": "^7.23.1", + "eslint-plugin-react-hooks": "^4.2.0", + "ethers": "^5.4.1", + "graphql": "^15.5.0", + "immer": "^9.0.2", + "ipfs-core": "^0.6.1", + "ipfs-http-client": "^50.1.0", + "lint-staged": "^10.5.4", + "moment": "^2.29.1", + "node-sass": "^5.0.0", + "notistack": "^1.0.7", + "react": "^17.0.2", + "react-activation": "^0.9.4", + "react-dom": "^17.0.2", + "react-hook-form": "^7.6.0", "react-router-dom": "^5.2.0", - "react-scripts": "4.0.1", - "react-spring": "^8.0.27", - "styled-components": "^5.1.0", - "token-amount": "^0.3.0", + "react-scripts": "4.0.3", + "source-map-explorer": "^2.5.2", + "styled-components": "^5.3.0", "typescript": "^4.1.2", - "use-viewport": "^0.2.0", - "use-wallet": "^0.8.0", - "web3-eth-abi": "^1.3.0", - "web3-utils": "^1.3.0" + "use-wallet": "^0.8.1", + "web-vitals": "^1.0.1" }, "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "eject": "react-scripts eject" + "sync-assets": "copy-aragon-ui-assets ./public", + "analyze": "source-map-explorer 'build/static/js/*.js'", + "start": "yarn sync-assets && react-app-rewired start", + "start:mainnet": "cross-env REACT_APP_ENVIRONMENT=mainnet yarn start", + "start:rinkeby": "cross-env REACT_APP_ENVIRONMENT=rinkeby yarn start", + "start:staging": "cross-env REACT_APP_ENVIRONMENT=staging yarn start", + "build": "yarn sync-assets && react-app-rewired build", + "build:mainnet": "cross-env REACT_APP_ENVIRONMENT=mainnet yarn build", + "build:rinkeby": "cross-env REACT_APP_ENVIRONMENT=rinkeby yarn build", + "build:staging": "cross-env REACT_APP_ENVIRONMENT=staging yarn build", + "test": "echo skipping until we fix tests with material ui issues. // react-app-rewired test", + "eject": "react-scripts eject", + "lint": "eslint src --ext .tsx", + "lint:js": "npm run lint:eslint -- . ", + "lint:error-only": "eslint --quiet \"src/**/*.{ts,tsx}\"", + "lint:fix": "npm run lint -- --fix", + "precommit": "lint-staged" }, "eslintConfig": { - "extends": "react-app" + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "lint-staged": { + "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ + "prettier --write" + ] }, "browserslist": { "production": [ @@ -47,31 +94,17 @@ ] }, "devDependencies": { - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@types/jest": "^26.0.14", - "@types/node": "^14.11.2", - "@types/react": "^16.9.49", - "@types/react-dom": "^16.9.8", - "@types/react-router-dom": "^5.1.5", - "@types/styled-components": "^5.1.3", - "@typescript-eslint/eslint-plugin": "^4.9.0", - "@typescript-eslint/parser": "^4.9.0", - "babel-eslint": "^10.1.0", - "babel-plugin-styled-components": "^1.10.7", - "eslint-config-prettier": "^6.11.0", - "eslint-config-standard": "^14.1.1", - "eslint-config-standard-react": "^9.2.0", - "eslint-import-resolver-typescript": "^2.3.0", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-jest": "^23.13.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-react": "^7.20.0", - "eslint-plugin-react-hooks": "^4.0.2", - "eslint-plugin-standard": "^4.0.1", - "prettier": "^2.0.5" + "@typescript-eslint/eslint-plugin": "^4.19.0", + "@typescript-eslint/parser": "^4.19.0", + "babel-loader": "8.1.0", + "babel-plugin-styled-components": "^1.12.0", + "cross-env": "^7.0.3", + "customize-cra": "^1.0.0", + "eslint-config-prettier": "4.1.0", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-react-hooks": "^4.2.0", + "husky": "^5.2.0", + "prettier": "^2.2.1", + "react-app-rewired": "^2.1.8" } } diff --git a/packages/govern-console/public/favicon.png b/packages/govern-console/public/favicon.png deleted file mode 100644 index 516c7fd0fefdf7fa8303115ba22c7c4ab236e730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5488 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 - + - - + + + Aragon Govern - Optimistic Governance for DAOs + + + - Aragon Console + +
+ diff --git a/packages/govern-console/public/logo192.png b/packages/govern-console/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/packages/govern-console/public/manifest.json b/packages/govern-console/public/manifest.json index 080d6c77a..724b88ea6 100644 --- a/packages/govern-console/public/manifest.json +++ b/packages/govern-console/public/manifest.json @@ -1,25 +1,19 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "name": "Aragon Console", + "short_name": "Aragon Console", "icons": [ { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" + "src": "/media/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" }, { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" + "src": "/media/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" } ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" } diff --git a/packages/govern-console/public/media/android-chrome-192x192.png b/packages/govern-console/public/media/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5d3c3beb0c6bf3cbf021105d74772ec551ca94 GIT binary patch literal 12210 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 z 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 E0N*r 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 literal 0 HcmV?d00001 diff --git a/packages/govern-console/public/media/apple-touch-icon.png b/packages/govern-console/public/media/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..92ee29b877d884cd65e487b1625211556f7299fd GIT binary patch literal 11691 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 MsGLZxkU`LY09IWy!2kdN literal 0 HcmV?d00001 diff --git a/packages/govern-console/public/media/browserconfig.xml b/packages/govern-console/public/media/browserconfig.xml new file mode 100644 index 000000000..82bb44219 --- /dev/null +++ b/packages/govern-console/public/media/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #ffffff + + + diff --git a/packages/govern-console/public/media/favicon-16x16.png b/packages/govern-console/public/media/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef0c7c96a47be08938b756b97df217bc0d47aeb GIT binary patch literal 1505 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 NabFR?srgfN{2%YW(#HS* literal 0 HcmV?d00001 diff --git a/packages/govern-console/public/media/mstile-150x150.png b/packages/govern-console/public/media/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..2c21641bb627ce516fb3f87fa7401787f4daf368 GIT binary patch literal 13636 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 + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/packages/govern-console/src/App.css b/packages/govern-console/src/App.css new file mode 100644 index 000000000..48b039ab3 --- /dev/null +++ b/packages/govern-console/src/App.css @@ -0,0 +1,40 @@ +@import url('https://fonts.googleapis.com/css?family=Manrope:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/packages/govern-console/src/App.test.tsx b/packages/govern-console/src/App.test.tsx new file mode 100644 index 000000000..2a68616d9 --- /dev/null +++ b/packages/govern-console/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/packages/govern-console/src/App.tsx b/packages/govern-console/src/App.tsx index dd1103dff..ba6e0c484 100644 --- a/packages/govern-console/src/App.tsx +++ b/packages/govern-console/src/App.tsx @@ -1,47 +1,15 @@ -import React, { useEffect } from 'react' -import { Route, Switch, useLocation } from 'react-router-dom' -import 'styled-components/macro' -import SelectDao from './pages/SelectDao' -import ViewDao from './pages/ViewDao' -import Header from './components/Header/Header' -import { useChainId } from './lib/chain-id' -import env from './environment' - -function App(): JSX.Element { - const location = useLocation() - const { chainId, updateChainId } = useChainId() - - useEffect(() => { - window.scrollTo(0, 0) - }, [location.pathname]) - - // If the ChainId doesn’t exist, we redirect - // to the default, defined in the environment. - useEffect(() => { - if (chainId === -1) { - updateChainId(env('CHAIN_ID')) - } - }, [chainId, updateChainId]) +import Home from 'containers/HomePage/HomePage'; +import { HashRouter as Router } from 'react-router-dom'; +import { WalletProvider } from './AugmentedWallet'; +const App = () => { return ( -

-
- - - - - - - - -
- ) -} - -export default App + + + + + + ); +}; + +export default App; diff --git a/packages/govern-console/src/AragonTheme.tsx b/packages/govern-console/src/AragonTheme.tsx new file mode 100644 index 000000000..bf3578443 --- /dev/null +++ b/packages/govern-console/src/AragonTheme.tsx @@ -0,0 +1,386 @@ +import { createMuiTheme } from '@material-ui/core/styles'; + +interface CustomTheme { + mainBackground: string; + gradients: { + aragon: string; + challenge: string; + }; + plain: { + blue: string; + cyan: string; + sapphire: string; + amethyst: string; + }; + greyscale: { + solid: string; + medium: string; + soft: string; + light: string; + }; + informative: { + green: string; + orange: string; + yellow: string; + red: string; + }; + light: { + cream: string; + skin: string; + sky: string; + grass: string; + violet: string; + }; + daoCard: { + background: string; + border: string; + labelColor: string; + fontFamily: string; + fontStyle: string; + labeFontSize: string; + labelLineHeight: string; + labelFontWeight: number; + propertyLabelFontWeight: number; + propertLabelFontSize: number; + propertyLabelLineHeight: string; + propertyTextLineHeight: string; + propertyTextFontWeight: number; + propertyTextFontSize: string; + propertyLabelColor: string; + propertyTextColor: string; + }; + proposalCard: { + background: string; + border: string; + labelColor: string; + labelFontSize: string; + labelFontWeight: number; + labelLineHeight: string; + fontStyle: string; + fontFamily: string; + dateColor: string; + dateFontSize: string; + dateLineHeight: string; + dateFontWeight: number; + }; + daoHeader: { + background: string; + labelFontSize: string; + labelLineHeight: string; + labelColor: string; + labelFontWeight: number; + valueFontSize: string; + valueFontWeight: number; + valueLineHeight: string; + valueColor: string; + }; + modal: { + labelFontSize: string; + labelLineHeight: string; + labelColor: string; + labelFontWeight: number; + valueFontSize: string; + valueFontWeight: number; + valueLineHeight: string; + valueColor: string; + }; + labels: { + grey: string; + orange: string; + purple: string; + green: string; + red: string; + black: string; + lightBlue: string; + }; + transactionKeeper: { + wrapper: { + background: string; + }; + title: { + fontStyle: string; + fontFamily: string; + fontWeight: number; + fontSize: string; + lineHeight: string; + color: string; + }; + transactionMessagesCard: { + background: string; + borderRadius: string; + color: string; + boldText: { + fontStyle: string; + fontFamily: string; + fontWeight: number; + fontSize: string; + lineHeight: string; + }; + text: { + fontStyle: string; + fontFamily: string; + fontWeight: number; + fontSize: string; + lineHeight: string; + }; + }; + }; + black: string; + white: string; +} + +// https://material-ui.com/customization/theming/#custom-variables +declare module '@material-ui/core/styles/createMuiTheme' { + interface Theme { + custom: CustomTheme; + } + // allow configuration using `createMuiTheme` + interface ThemeOptions { + custom: CustomTheme; + } +} + +const typography = { + fontFamily: 'Manrope', + h1: { + fontSize: 40, + fontWeight: 600, + letterSpacing: '-0.02em', + }, + h2: { + fontSize: 36, + fontWeight: 500, + letterSpacing: '-0.01em', + }, + h3: { + fontSize: 24, + fontWeight: 500, + letterSpacing: '-0.01em', + }, + h4: { + fontSize: 18, + fontWeight: 600, + }, + h5: { + fontSize: 12, + fontWeight: 600, + }, + text: { + normal: { + fontSize: 16, + fontWeight: 500, + color: '#7483B2', + }, + link: { + fontSize: 16, + fontWeight: 500, + color: '#0176FF', + }, + bold: { + fontSize: 16, + fontWeight: 500, + color: '#20232C', + }, + small: { + fontSize: 14, + fontWeight: 500, + color: '#20232C', + }, + }, +}; + +const custom = { + mainBackground: '#F6F9FC', + gradients: { + aragon: 'linear-gradient(107.79deg, #00C2FF 1.46%, #01E8F7 100%)', + challenge: 'linear-gradient(92.89deg, #F7B201 -16.92%, #FF7A00 100%)', + }, + plain: { + blue: '#00C2FF', + cyan: '#01E8F7', + sapphire: '#0176FF', + amethyst: '#865BFF', + }, + greyscale: { + solid: '#7483B2', + medium: '#B0BDE6', + soft: '#D9E0F5', + light: '#F5F7FF', + }, + informative: { + green: '#18D179', + orange: '#FF7A00', + yellow: '#FFC83A', + red: '#FF5823', + }, + light: { + cream: '#FFF9EF', + skin: '#FFF1ED', + sky: '#ECFAFF', + grass: '#EFFFF7', + violet: '#F3F4FF', + }, + daoCard: { + background: '#FFFFFF', + border: '#ECF1F7', + labelColor: '-webkit-linear-gradient(107.79deg, #87E0FF 1.46%, #7A7AF7 100%)', + fontFamily: 'Manrope', + fontStyle: 'normal', + labeFontSize: '24px', + labelLineHeight: '30.02px', + labelFontWeight: 600, + propertyLabelFontWeight: 400, + propertLabelFontSize: 15, + propertyLabelLineHeight: '18.77px', + propertyTextLineHeight: '27.52px', + propertyTextFontWeight: 500, + propertyTextFontSize: '22px', + propertyLabelColor: '#7E89AC', + propertyTextColor: '#20232C', + }, + proposalCard: { + background: '#FFFFFF', + border: '#ECF1F7', + labelColor: '#20232C', + labelFontSize: '28px', + labelFontWeight: 600, + labelLineHeight: '38px', + fontStyle: 'normal', + fontFamily: 'Manrope', + dateColor: '#7483AB', + dateFontSize: '18px', + dateLineHeight: '24.84px', + dateFontWeight: 400, + }, + daoHeader: { + background: `linear-gradient(107.79deg, #E4F8FF 1.46%, #F1F1FF 100%)`, + labelFontSize: '18px', + labelLineHeight: '24.84px', + labelColor: '#7483B3', + labelFontWeight: 400, + valueFontSize: '38px', + valueFontWeight: 500, + valueLineHeight: '51.91px', + valueColor: '#20232C', + }, + modal: { + labelFontSize: '18px', + labelLineHeight: '24.59px', + labelColor: '#7483B3', + labelFontWeight: 400, + valueFontSize: '18px', + valueFontWeight: 500, + valueLineHeight: '24.59px', + valueColor: '#20232C', + }, + labels: { + grey: '#7483AB', + orange: 'linear-gradient(107.79deg, #FF7984 1.46%, #FFEB94 100%)', + purple: '#635BFF', + green: '#4BDD7C', + red: '#FF6A60', + black: '#20232C', + lightBlue: '#00C2FF', + }, + transactionKeeper: { + wrapper: { + background: '#ffffff', + }, + title: { + fontWeight: 500, + fontSize: '28px', + lineHeight: '38px', + fontFamily: 'Manrope', + fontStyle: 'normal', + color: '#20232C', + }, + transactionMessagesCard: { + background: '#F6F9FC', + borderRadius: '10px', + boldText: { + fontWeight: 600, + fontSize: '14px', + lineHeight: '19px', + fontFamily: 'Manrope', + fontStyle: 'normal', + }, + text: { + fontWeight: 500, + fontSize: '14px', + lineHeight: '22px', + fontFamily: 'Manrope', + fontStyle: 'normal', + }, + color: '#0176FF', + }, + }, + black: '#20232C', + white: '#FFFFFF', +}; +// const breakpoints = { +// values: { +// xs: 320, +// sm: 768, +// md: 964, +// lg: 964, +// xl: 964, +// }, +// }; +export const lightTheme = createMuiTheme({ + custom, + shape: { + borderRadius: 16, + }, + palette: { + background: { + default: '#fff', + }, + }, + typography, + // breakpoints, + overrides: { + // MuiPickersToolbar: { + // toolbar: { + // backgroundColor: '#00C2FF', + // }, + // }, + // MuiPickersCalendarHeader: { + // switchHeader: { + // // backgroundColor: lightBlue.A200, + // // color: "white", + // }, + // }, + // MuiPickersDay: { + // daySelected: { + // backgroundColor: '#00C2FF', + // }, + // dayDisabled: { + // color: lightBlue['100'], + // }, + // current: { + // color: lightBlue['900'], + // }, + // }, + // MuiPickersClock: { + // pin: { + // backgroundColor: '#00C2FF', + // }, + // }, + // MuiPickersClockPointer: { + // thumb: { + // border: '14px solid #00C2FF', + // }, + // noPoint: { + // backgroundColor: '#00C2FF', + // }, + // pointer: { + // backgroundColor: '#00C2FF', + // }, + // }, + // MuiPickersModal: { + // dialogAction: { + // color: lightBlue['400'], + // }, + // }, + }, +}); diff --git a/packages/govern-console/src/AugmentedWallet.tsx b/packages/govern-console/src/AugmentedWallet.tsx new file mode 100644 index 000000000..33058fcd3 --- /dev/null +++ b/packages/govern-console/src/AugmentedWallet.tsx @@ -0,0 +1,75 @@ +import React, { useEffect, useContext, useMemo } from 'react'; +import { providers as EthersProviders } from 'ethers'; +import { UseWalletProvider, useWallet } from 'use-wallet'; +import { Account } from 'utils/types'; +import { INFURA_PROJECT_ID } from 'utils/constants'; +import { networkEnvironment } from 'environment'; +import { identifyUser } from 'services/analytics'; +const { chainId } = networkEnvironment; + +const WalletAugmentedContext = React.createContext({}); + +function useWalletAugmented() { + return useContext(WalletAugmentedContext); +} + +// Adds Ethers.js to the useWallet() object +const WalletAugmented: React.FC = ({ children }) => { + const wallet = useWallet(); + const ethereum: any = wallet.ethereum; + const fallbackProvider = new EthersProviders.InfuraProvider(chainId, INFURA_PROJECT_ID); + const [provider, updateProvider] = React.useState(fallbackProvider); + + const injectedProvider = useMemo( + () => (ethereum ? new EthersProviders.Web3Provider(ethereum) : null), + [ethereum], + ); + + useEffect(() => { + if ( + wallet.status === 'connected' && + typeof wallet.account === 'string' && + wallet.connector && + wallet.networkName + ) { + identifyUser(wallet.account, wallet.networkName, wallet.connector); + } + }, [wallet.networkName, wallet.connector, wallet.status, wallet.account]); + + useEffect(() => { + if (injectedProvider) updateProvider(injectedProvider); + }, [injectedProvider]); + + const contextValue = useMemo(() => { + let account: Account | undefined = undefined; + if (injectedProvider && wallet.account) { + account = { + address: wallet.account, + signer: injectedProvider.getSigner(), + }; + } + + return { + ...wallet, + isConnected: wallet.status === 'connected', + provider, + account, + }; + }, [wallet, provider, injectedProvider]); + + return ( + + {children} + + ); +}; + +const WalletProvider: React.FC = ({ children }) => { + return ( + + {children} + + ); +}; + +export { useWalletAugmented as useWallet, WalletProvider }; diff --git a/packages/govern-console/src/Providers/GeneralProvider.tsx b/packages/govern-console/src/Providers/GeneralProvider.tsx deleted file mode 100644 index 1453cb8ac..000000000 --- a/packages/govern-console/src/Providers/GeneralProvider.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import WalletProvider from './Wallet' -import PermissionsProvider from './Permissions' - -export default function GeneralProvider({ - children, -}: { - children: React.ReactNode -}): JSX.Element { - return ( - - {children} - - ) -} diff --git a/packages/govern-console/src/Providers/Permissions.tsx b/packages/govern-console/src/Providers/Permissions.tsx deleted file mode 100644 index 8ffcf24d7..000000000 --- a/packages/govern-console/src/Providers/Permissions.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import React, { - createContext, - useCallback, - useContext, - useMemo, - useReducer, -} from 'react' -import { useWalletAugmented } from './Wallet' -import { addressesEqual, ETH_ANY_ADDRESS } from '../lib/web3-utils' -import { KNOWN_QUEUE_ROLES } from '../lib/known-roles' - -type Permissions = { - execute: boolean - schedule: boolean - veto: boolean - challenge: boolean -} - -type PermissionsData = { - permissions: Permissions - populatePermissions: (rawRoles: Role[]) => void -} - -function isPermissionsKey(value: unknown): value is keyof Permissions { - return ( - value === 'execute' || - value === 'schedule' || - value === 'veto' || - value === 'challenge' - ) -} - -const PermissionsContext = createContext(null) - -export function usePermissions(): PermissionsData { - const permissionsContext = useContext(PermissionsContext) - - if (!permissionsContext) { - throw new Error( - 'usePermissions can only be used inside a PermissionsProvider', - ) - } - - return permissionsContext -} - -type Role = { - frozen: string - selector: string - who: string -} - -function permissionsFromRoles( - account: string, - roles: Role[], - permissions: Permissions = { - execute: false, - schedule: false, - veto: false, - challenge: false, - }, -): Permissions { - return roles.reduce( - (permissions: Permissions, role: Role) => { - const anyOrCurrentAccount = - addressesEqual(role.who, ETH_ANY_ADDRESS) || - addressesEqual(role.who, account) - - if (!anyOrCurrentAccount) { - return permissions - } - - const roleName = KNOWN_QUEUE_ROLES.get(role.selector) - if (roleName && isPermissionsKey(roleName)) { - permissions[roleName] = true - } - return permissions - }, - { ...permissions }, - ) -} - -function permissionsReducer( - permissions: Permissions, - { account, roles }: { account: string; roles: Role[] }, -) { - return permissionsFromRoles(account, roles, permissions) -} - -export default function PermissionsProvider({ - children, -}: { - children: React.ReactNode -}): JSX.Element { - const [permissions, dispatchPermissions] = useReducer< - React.Reducer - >(permissionsReducer, { - execute: false, - schedule: false, - veto: false, - challenge: false, - }) - - const { wallet } = useWalletAugmented() - const { account } = wallet - - const populatePermissions = useCallback( - (roles: Role[]) => { - dispatchPermissions({ account: account ?? '', roles }) - }, - [account], - ) - - const contextValue = useMemo( - () => ({ - permissions, - populatePermissions, - }), - [permissions, populatePermissions], - ) - - return ( - - {children} - - ) -} diff --git a/packages/govern-console/src/Providers/Wallet.tsx b/packages/govern-console/src/Providers/Wallet.tsx deleted file mode 100644 index aff5c871d..000000000 --- a/packages/govern-console/src/Providers/Wallet.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { createContext, useContext, useMemo } from 'react' -import { providers as EthersProviders } from 'ethers' -import { UseWalletProvider, useWallet, Wallet } from 'use-wallet' -import { useChainId } from '../lib/chain-id' -import { getNetworkNode, getUseWalletConnectors } from '../lib/web3-utils' - -// From ethers.js -export type Eip1193Provider = { - isMetaMask?: boolean - host?: string - path?: string - sendAsync?: ( - request: { method: string; params?: Array }, - callback: (error: any, response: any) => void, - ) => void - send?: ( - request: { method: string; params?: Array }, - callback: (error: any, response: any) => void, - ) => void - request?: (request: { method: string; params?: Array }) => Promise -} - -export type WalletAugmentedData = { - wallet: Wallet - ethers: any -} - -const WalletAugmentedContext = createContext(null) - -export function useWalletAugmented(): WalletAugmentedData { - const walletContext = useContext(WalletAugmentedContext) - if (!walletContext) { - throw new Error( - 'useWalletAugmented can only be used inside a WalletProvider', - ) - } - return walletContext -} - -// Adds Ethers.js to the useWallet() object -function WalletAugmented({ - children, -}: { - children: React.ReactNode -}): JSX.Element { - const wallet = useWallet() - const { ethereum } = wallet - const { chainId } = useChainId() - - const ethers = useMemo( - () => - ethereum - ? new EthersProviders.Web3Provider(ethereum) - : new EthersProviders.JsonRpcProvider(getNetworkNode(chainId)), - [chainId, ethereum], - ) - - const contextValue = useMemo(() => ({ wallet, ethers }), [wallet, ethers]) - - return ( - - {children} - - ) -} - -export default function WalletProvider({ - children, -}: { - children: React.ReactNode -}): JSX.Element { - const { chainId } = useChainId() - - return ( - - {children} - - ) -} -/* eslint-disable react/prop-types */ - -export { useWalletAugmented as useWallet } diff --git a/packages/govern-console/src/ReusableStyles.tsx b/packages/govern-console/src/ReusableStyles.tsx new file mode 100644 index 000000000..f0ee119bc --- /dev/null +++ b/packages/govern-console/src/ReusableStyles.tsx @@ -0,0 +1,14 @@ +import { makeStyles, createStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles(() => + createStyles({ + noSelectText: { + webkitTouchCallout: 'none' /* iOS Safari */, + webkitUserSelect: 'none' /* Safari */, + userSelect: + 'none' /* Non-prefixed version, currently supported by Chrome, Edge, Opera and Firefox */, + }, + }), +); + +export default useStyles; diff --git a/packages/govern-console/src/abis/court.tsx b/packages/govern-console/src/abis/court.tsx new file mode 100644 index 000000000..9d528e398 --- /dev/null +++ b/packages/govern-console/src/abis/court.tsx @@ -0,0 +1,3 @@ +export const CourtABI = [ + 'function getDisputeFees() external view returns (address recipient, address feeToken, uint256 feeAmount)', +]; diff --git a/packages/govern-console/src/abis/erc20.tsx b/packages/govern-console/src/abis/erc20.tsx new file mode 100644 index 000000000..3a31ed0ff --- /dev/null +++ b/packages/govern-console/src/abis/erc20.tsx @@ -0,0 +1,9 @@ +export const erc20TokenABI = [ + 'function allowance(address owner, address spender) external view returns (uint256)', + 'function allowed(address owner, address spender) external view returns (uint256)', + 'function approve(address spender, uint256 value) returns (bool)', + 'function balanceOf(address who) public view returns (uint256)', + 'function totalSupply() public view returns (uint256)', + 'function decimals() view returns (uint8)', + 'function symbol() public view returns (string)', +]; diff --git a/packages/govern-console/src/apps/Erc.tsx b/packages/govern-console/src/apps/Erc.tsx deleted file mode 100644 index e2f091dcb..000000000 --- a/packages/govern-console/src/apps/Erc.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import React, { useCallback, useState } from 'react' -import { useHistory } from 'react-router-dom' -import 'styled-components/macro' -import Button from '../components/Button' -import ercAbi from '../lib/abi/erc20.json' -import { useContract } from '../lib/web3-contracts' - -export default function ErcTool() { - const [tokenAddress, setTokenAddress] = useState('') - const history = useHistory() - const tokenContract = useContract(tokenAddress, ercAbi) - - const handleChangeTokenAddress = useCallback(e => { - setTokenAddress(e.target.value) - }, []) - - return ( - <> - -
-

ERC-20 Tool

-
- -
- {tokenAddress && - ercAbi.map( - abiItem => - abiItem?.type === 'function' && ( -
- -
- ), - )} -
- - ) -} - -type Input = { - name: string | undefined - type: string | undefined -} - -type ContractCallHandlerProps = { - constant: boolean - ercContract: any - name: string - inputs: Input[] | any[] -} - -function ContractCallHandler({ - constant, - ercContract, - name, - inputs, -}: ContractCallHandlerProps) { - const [result, setResult] = useState('') - const [values, setValues] = useState(() => { - if (inputs.length === 0) { - return null - } - // @ts-ignore - // Sorry but I got very tired of fighting with types - return inputs.map((input: any) => ({ - name: input.name, - type: input.type, - value: '', - })) - }) - - const updateValue = useCallback( - (name, updatedValue) => { - if (values) { - setValues((elements: any) => - elements.map((element: any) => - element.name === name - ? { ...element, value: updatedValue } - : element, - ), - ) - } - }, - [values], - ) - - const handleExecute = useCallback( - async e => { - e.preventDefault() - try { - if (constant) { - let res - if (values) { - const args = values.map((val: any) => val.value) - res = await ercContract[name](...args) - setResult(res.toString()) - return - } else { - res = await ercContract[name]() - setResult(res.toString()) - return - } - } - const args = (values as any).map((val: any) => val.value) - const res = await ercContract[name](...args) - setResult(res.hash) - } catch (e) { - console.error(e) - } - }, - [ercContract, constant, name, values], - ) - - return ( - <> -

{name}

-
- {values?.map((value: any, i: number) => ( -
- -
- ))} - - Result: {result} -
- - ) -} diff --git a/packages/govern-console/src/assets/aragon-metal.svg b/packages/govern-console/src/assets/aragon-metal.svg deleted file mode 100644 index 718a9435b..000000000 --- a/packages/govern-console/src/assets/aragon-metal.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/govern-console/src/components/ActionBuilder/ActionBuilder.tsx b/packages/govern-console/src/components/ActionBuilder/ActionBuilder.tsx new file mode 100644 index 000000000..3415f35ef --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/ActionBuilder.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { ActionBuilderCloseHandler, ActionBuilderState as State } from 'utils/types'; +import { AssetWithdrawal } from './Screens/AssetWithdrawal'; +import { TokenMinter } from './Screens/TokenMinter'; +import { ActionSelector } from './Screens/ActionSelector'; +import { AbiForm } from './Screens/AbiForm'; +import { FunctionSelector } from './Screens/FunctionSelector'; +import { ActionBuilderModal } from './ActionBuilderModal'; +import { ActionBuilderStateProvider, useActionBuilderState } from './ActionBuilderStateProvider'; +import { useParams } from 'react-router-dom'; +import { useDaoQuery } from 'hooks/query-hooks'; +import { Deposit } from 'components/ActionBuilder/Screens/Deposit'; +import TransactionKeeper from 'components/TransactionKeeper/TransactionKeeper'; + +type ActionBuilderProps = { + initialState?: State; + visible: boolean; + onClose: ActionBuilderCloseHandler; +}; + +const ActionBuilderSwitcher: React.FC = ({ visible, onClose }) => { + const { state, transactions } = useActionBuilderState(); + + return ( + + {() => { + switch (state) { + case 'deposit': + return ; + case 'chooseAction': + return ; + case 'mintTokens': + return ; + case 'withdrawAssets': + return ; + case 'chooseFunctions': + return ; + case 'abiForm': + return ; + case 'processTransaction': + return ( + + ); + default: + return null; + } + }} + + ); +}; + +export const ActionBuilder: React.FC = ({ initialState, visible, onClose }) => { + const { daoName } = useParams(); + const { data: dao, loading, error } = useDaoQuery(daoName); + + if (loading || error) return null; + + return ( + + + + ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/ActionBuilderModal.tsx b/packages/govern-console/src/components/ActionBuilder/ActionBuilderModal.tsx new file mode 100644 index 000000000..9f3b88a1a --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/ActionBuilderModal.tsx @@ -0,0 +1,32 @@ +import { ReactNode } from 'react'; +import { Modal, IconCross, ButtonIcon, GU } from '@aragon/ui'; + +type ActionBuilderModalProps = { + visible: boolean; + onClose: () => void; + children: () => ReactNode; +}; + +export const ActionBuilderModal: React.FC = ({ + visible, + onClose, + children, +}) => { + return ( + + onClose()} + css={` + position: absolute; + z-index: 2; + top: ${2 * GU}px; + right: ${2 * GU}px; + `} + > + + + {children()} + + ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/ActionBuilderStateProvider.tsx b/packages/govern-console/src/components/ActionBuilder/ActionBuilderStateProvider.tsx new file mode 100644 index 000000000..ed5bd9b79 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/ActionBuilderStateProvider.tsx @@ -0,0 +1,98 @@ +import React, { ReactNode, createContext, useMemo, useState, useContext, useCallback } from 'react'; +import { ActionBuilderState, CustomTransaction } from 'utils/types'; + +type ActionBuilderStateProviderProps = { + children: ReactNode; + dao: any; + initialState?: ActionBuilderState; +}; + +type ActionBuilderStateContext = { + state: ActionBuilderState; + contractAddress: string | null; + abi: string | null; + dao: any; + transactions: CustomTransaction[]; + gotoState: (newState: ActionBuilderState) => void; + gotoFunctionSelector: (contractAddress: string, abi: string) => void; + gotoProcessTransaction: (transactions: CustomTransaction[]) => void; +}; + +const defaultState: ActionBuilderState = 'chooseAction'; +const UseActionBuilderStateContext = createContext(null); + +const ActionBuilderStateProvider: React.FC = ({ + initialState, + dao, + children, +}) => { + const [state, setState] = useState( + initialState || defaultState, + ); + + const [contractAddress, setContractAddress] = useState< + ActionBuilderStateContext['contractAddress'] + >(null); + + const [abi, setAbi] = useState(null); + const [transactions, setTransactions] = useState([]); + + const gotoState = useCallback( + (newState: ActionBuilderState) => { + setState(newState); + }, + [setState], + ); + + const gotoFunctionSelector = useCallback( + (contractAddress: string, abi: string) => { + setContractAddress(contractAddress); + setAbi(abi); + setState('chooseFunctions'); + }, + [setState, setContractAddress], + ); + + const gotoProcessTransaction = useCallback( + (transactions: CustomTransaction[]) => { + setTransactions(transactions); + setState('processTransaction'); + }, + [setTransactions, setState], + ); + + const contextValue = useMemo( + (): ActionBuilderStateContext => ({ + state, + contractAddress, + abi, + dao, + transactions, + gotoState, + gotoFunctionSelector, + gotoProcessTransaction, + }), + [ + state, + contractAddress, + dao, + abi, + transactions, + gotoState, + gotoFunctionSelector, + gotoProcessTransaction, + ], + ); + + return ( + + {children} + + ); +}; + +function useActionBuilderState(): ActionBuilderStateContext { + return useContext(UseActionBuilderStateContext) as ActionBuilderStateContext; +} + +export { ActionBuilderStateProvider, useActionBuilderState }; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/AbiForm.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/AbiForm.tsx new file mode 100644 index 000000000..d23395b60 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/AbiForm.tsx @@ -0,0 +1,168 @@ +import React, { useCallback, useState } from 'react'; +import { + StyledText, + Button, + TextInput, + IconWarning, + Grid, + GridItem, + Help, + useTheme, + useLayout, + SPACING, + Info, +} from '@aragon/ui'; +import { Controller, useForm } from 'react-hook-form'; +import { validateContract, validateAbi } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import AbiHandler from 'utils/AbiHandler'; +import { constants } from 'ethers'; + +type FormInput = { + contractAddress: string; + abi: string; +}; + +export const AbiForm: React.FC = () => { + const context: any = useWallet(); + const { provider, networkName } = context; + + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + const compact = layoutName === 'small'; + + const methods = useForm(); + const { control, handleSubmit, trigger, getValues, formState } = methods; + + const { gotoFunctionSelector } = useActionBuilderState(); + const [showAbi, setShowAbi] = useState(false); + + const gotoNextScreen = useCallback(() => { + const formData = getValues(); + gotoFunctionSelector(formData.contractAddress, formData.abi); + }, [getValues, gotoFunctionSelector]); + + const fetchAbi = useCallback(async () => { + const validationResult = await trigger('contractAddress'); + if (validationResult === false) { + // address is invalid + return; + } + + const address = getValues('contractAddress'); + const abiHandler = new AbiHandler(networkName); + const abi = await abiHandler.get(address); + if (abi) { + gotoFunctionSelector(address, abi); + } else { + setShowAbi(true); + } + }, [networkName, trigger, getValues, gotoFunctionSelector, setShowAbi]); + + return ( + + + Contract address + + + Input contract address +
+
+ await validateContract(value, provider), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> +
+
+ + {!compact && formState.errors.contractAddress && ( +
filler
+ )} +
+
+
+ {showAbi && ( + + + +
+ + Contract not verified, please insert the input function ABI +
+
+
+ + +
+
Input function ABI
+
+ + An ABI is the specification used to interact with Ethereum smart contracts + +
+
+
+ validateAbi(value), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> +
+ + + +
+ )} +
+ ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/ActionSelector.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/ActionSelector.tsx new file mode 100644 index 000000000..414f4d627 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/ActionSelector.tsx @@ -0,0 +1,53 @@ +import { ReactNode } from 'react'; +import { Box, StyledText } from '@aragon/ui'; +import { Hint } from 'components/Hint/Hint'; +import { ActionBuilderState } from 'utils/types'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import { utils, constants } from 'ethers'; + +type ActionOption = { + title: ReactNode; + subTitle: ReactNode; + state: ActionBuilderState; +}; + +const actions: ActionOption[] = [ + { + title: 'Send DAO funds', + subTitle: 'Transfer DAO funds to any address.', + state: 'withdrawAssets', + }, + { title: 'Mint tokens', subTitle: 'Mint more DAO tokens.', state: 'mintTokens' }, + { + title: 'External contract', + subTitle: 'Interact with any contract on the blockchain and access any functionality.', + state: 'abiForm', + }, +]; + +const haveMinter = (dao: any): boolean => { + const result = dao?.minter && utils.isAddress(dao.minter) && dao.minter !== constants.AddressZero; + return result; +}; + +export const ActionSelector = () => { + const { gotoState, dao } = useActionBuilderState(); + return ( + <> + Select Action + {actions.map((action, i) => { + if (action.state === 'mintTokens' && !haveMinter(dao)) { + return null; + } + return ( + +
gotoState(action.state)}> + {action.title} + {action.subTitle} +
+
+ ); + })} + + ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/AssetWithdrawal.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/AssetWithdrawal.tsx new file mode 100644 index 000000000..96f9aec59 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/AssetWithdrawal.tsx @@ -0,0 +1,243 @@ +import React, { useCallback } from 'react'; +import { + Grid, + GridItem, + DropDown, + Button, + TextInput, + StyledText, + useTheme, + Tag, + SPACING, + useLayout, + useToast, +} from '@aragon/ui'; +import { ActionBuilderCloseHandler } from 'utils/types'; +import { Hint } from 'components/Hint/Hint'; +import { useForm, Controller } from 'react-hook-form'; +import { validateAmountForDecimals, validateToken } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import AbiHandler from 'utils/AbiHandler'; +import { Asset, AssetLabel, ETH, OTHER_TOKEN_SYMBOL } from 'utils/Asset'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import { getErrorFromException } from 'utils/HelperFunctions'; +import { networkEnvironment } from 'environment'; +import { constants } from 'ethers'; + +const { curatedTokens } = networkEnvironment; +const withdrawalAssets = Object.keys(curatedTokens).concat([ + ETH.symbol, + OTHER_TOKEN_SYMBOL, +]) as Array; + +const withdrawSignature = + 'function withdraw(address token, address from, address to, uint256 amount, string memory reference)'; + +type AssetWithdrawalProps = { + onClick: ActionBuilderCloseHandler; +}; + +type WithdrawalFormData = { + recipient: string; + token: number; + tokenContractAddress: string; + withdrawalAmount: string; + reference?: string; +}; + +export const AssetWithdrawal: React.FC = ({ onClick }) => { + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + + const context: any = useWallet(); + const { provider } = context; + + const { dao } = useActionBuilderState(); + const toast = useToast(); + + const methods = useForm(); + const { control, handleSubmit, watch, getValues } = methods; + const selectedToken = watch('token', 0); + + // build the action data to be scheduled + const buildActions = useCallback(async () => { + const { + token, + recipient, + tokenContractAddress, + withdrawalAmount, + reference = '', + } = getValues(); + + try { + const asset = await Asset.createFromDropdownLabel( + withdrawalAssets[token], + tokenContractAddress, + withdrawalAmount, + provider, + ); + + const executor = dao?.executor.address; + const values = [asset.address, executor, recipient, asset.amount, reference]; + const action = AbiHandler.mapToAction(withdrawSignature, executor, values); + + onClick(action); + } catch (err) { + console.log('withdrawal error', err); + const errorMessage = getErrorFromException(err); + toast(errorMessage); + } + }, [onClick, getValues, toast, dao, provider]); + + const validateAmount = useCallback( + async (value: string) => { + try { + const { token, tokenContractAddress } = getValues(); + const asset = await Asset.createFromDropdownLabel( + withdrawalAssets[token], + tokenContractAddress, + value, + provider, + ); + return validateAmountForDecimals(value, asset.decimals); + } catch (err) { + console.log('Error validiting amount', value, err); + return 'Error validiting amount'; + } + }, + [provider, getValues], + ); + + return ( + + + Send funds + Transfer DAO funds to any address. + + + ( + + )} + /> + + + Token + Choose which token you would like to withdraw. + ( +
+ + {error ?
{error.message}
: null} +
+ )} + /> +
+ {Asset.isOtherToken(withdrawalAssets[selectedToken]) && ( + + validateToken(value, provider), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + )} + + + ( + + )} + /> + + + + Reference + + + ( + + )} + /> + + + + +
+ ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/Deposit.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/Deposit.tsx new file mode 100644 index 000000000..3662ff34e --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/Deposit.tsx @@ -0,0 +1,248 @@ +import React, { useCallback } from 'react'; +import { + EthIdenticon, + RADIUS, + Tag, + Grid, + GridItem, + DropDown, + Button, + TextInput, + StyledText, + useTheme, + useLayout, + SPACING, + useToast, +} from '@aragon/ui'; +import { Hint } from 'components/Hint/Hint'; +import { useForm, Controller } from 'react-hook-form'; +import { validateAmountForDecimals, validateToken, validateBalance } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import { getTruncatedAccountAddress } from 'utils/account'; +import { getErrorFromException } from 'utils/HelperFunctions'; +import { Executor } from 'services/Executor'; +import { Asset, AssetLabel, ETH, OTHER_TOKEN_SYMBOL } from 'utils/Asset'; +import { networkEnvironment } from 'environment'; +const { curatedTokens } = networkEnvironment; + +const depositAssets = Object.keys(curatedTokens).concat([ + ETH.symbol, + OTHER_TOKEN_SYMBOL, +]) as Array; + +type DepositFormData = { + token: number; + tokenContractAddress: string; + depositAmount: string; + reference?: string; +}; + +export const Deposit: React.FC = () => { + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + + const context: any = useWallet(); + const { provider, account, networkName } = context; + + const methods = useForm(); + const { control, handleSubmit, watch, getValues } = methods; + const selectedToken = watch('token', 0); + + const { dao, gotoProcessTransaction } = useActionBuilderState(); + const toast = useToast(); + + const buildActions = useCallback(async () => { + const { token, tokenContractAddress, depositAmount, reference = '' } = getValues(); + + try { + const executor = new Executor(dao.executor.address, account.signer); + const asset = await Asset.createFromDropdownLabel( + depositAssets[token], + tokenContractAddress, + depositAmount, + provider, + ); + const transactions = await executor.deposit(asset, reference); + gotoProcessTransaction(transactions); + } catch (err) { + console.log('deposit error', err); + const errorMessage = getErrorFromException(err); + toast(errorMessage); + } + }, [getValues, account, dao, provider, toast, gotoProcessTransaction]); + + const validateAmount = useCallback( + async (value: string) => { + const { token: selectedIndex, tokenContractAddress } = getValues(); + try { + const asset = await Asset.createFromDropdownLabel( + depositAssets[selectedIndex], + tokenContractAddress, + value, + provider, + ); + + const result = validateAmountForDecimals(value, asset.decimals); + if (result !== true) { + return result; + } + + const owner = await account?.signer?.getAddress(); + return validateBalance(asset, owner, provider); + } catch (err) { + console.log('Error validating amount', err); + return 'Error validating amount'; + } + }, + [provider, getValues, account], + ); + + return ( + + + Deposit assets + + This will create a request on your wallet to transfer the amount of assets to the govern + executor address ({dao?.executor.address}) + + + + Wallet +
+ + +

{networkName}

+
+
+
+ + Asset + Choose which asset you would like to deposit. + ( +
+ + {error ?
{error.message}
: null} +
+ )} + /> +
+ {Asset.isOtherToken(depositAssets[selectedToken]) && ( + + validateToken(value, provider), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + )} + + + ( + + )} + /> + + + + Reference + + + ( + + )} + /> + + + + +
+ ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/FunctionSelector.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/FunctionSelector.tsx new file mode 100644 index 000000000..7411969b8 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/FunctionSelector.tsx @@ -0,0 +1,164 @@ +import React, { useState, useCallback, useEffect } from 'react'; +import { + Grid, + GridItem, + SearchInput, + StyledText, + Button, + useTheme, + Box, + SPACING, + useLayout, +} from '@aragon/ui'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import { getTruncatedAccountAddress } from 'utils/account'; +import { Stepper } from 'components/Stepper/Stepper'; +import { Hint } from 'components/Hint/Hint'; +import AbiHandler from 'utils/AbiHandler'; +import { ActionBuilderCloseHandler } from 'utils/types'; +import { utils } from 'ethers'; + +type FunctionSelectorProps = { + onClick: ActionBuilderCloseHandler; +}; + +type FunctionItem = { + signature: string; + name: string; + show: boolean; + count: number; +}; + +const formatSignature = (signature: string, functionName: string): string => { + const regex = new RegExp(`^.*${functionName}`, 'i'); + return signature.replace(regex, ''); +}; + +export const FunctionSelector: React.FC = ({ onClick }) => { + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + + const { contractAddress, abi } = useActionBuilderState(); + const [error, setError] = useState(false); + const [functions, setFunctions] = useState([]); + + useEffect(() => { + if (abi) { + const iface = new utils.Interface(abi); + const functions = Object.entries(iface.functions) + .filter(([_, fragment]) => !fragment.constant) + .map(([_key, fragment]) => ({ + name: fragment.name, + signature: fragment.format(utils.FormatTypes.full), + count: 0, + show: true, + })); + setFunctions(functions); + } + }, [abi, setFunctions]); + + const doSearch = useCallback( + (searchTerm: string) => { + setFunctions((existing) => { + return existing.map((item) => { + let show = true; + if (searchTerm) { + const regex = new RegExp(searchTerm, 'i'); + show = regex.test(item.name); + } + const newItem = { ...item, show }; + return newItem; + }); + }); + }, + [setFunctions], + ); + + const handleChange = useCallback( + (index: number, val: number) => { + setFunctions((existing) => { + return existing.map((item, itemIndex) => { + const newItem = { ...item }; + if (itemIndex === index) { + newItem.count = val; + } + + return newItem; + }); + }); + + if (val > 0) setError(false); + }, + [setFunctions, setError], + ); + + const submitActions = useCallback(() => { + if (contractAddress) { + const actions = functions + .filter(({ count }) => count > 0) + .reduce((result, field) => { + const { signature, count } = field; + const action = AbiHandler.mapToAction(signature, contractAddress, null); + return result.concat(Array(count).fill(action)); + }, [] as FunctionItem[]); + + if (actions.length === 0) { + setError(true); + } else { + onClick(actions); + } + } + }, [contractAddress, onClick, functions]); + + return ( + + + + Contract: {getTruncatedAccountAddress(contractAddress)} + + + + + + {functions.map((item, index) => { + if (!item.show) return null; + return ( +
+
+ {item.name} + {formatSignature(item.signature, item.name)} +
+ handleChange(index, val)} + /> +
+ ); + })} +
+ Please select at least one function. +
+
+
+ + + +
+ ); +}; diff --git a/packages/govern-console/src/components/ActionBuilder/Screens/TokenMinter.tsx b/packages/govern-console/src/components/ActionBuilder/Screens/TokenMinter.tsx new file mode 100644 index 000000000..21b900f07 --- /dev/null +++ b/packages/govern-console/src/components/ActionBuilder/Screens/TokenMinter.tsx @@ -0,0 +1,166 @@ +import React, { useCallback } from 'react'; +import { + Button, + StyledText, + TextInput, + ContentSwitcher, + Grid, + GridItem, + useLayout, + SPACING, + TextCopy, +} from '@aragon/ui'; +import { Hint } from 'components/Hint/Hint'; +import { useForm, Controller } from 'react-hook-form'; +import { validateAmountForDecimals, validateAddress } from 'utils/validations'; +import AbiHandler from 'utils/AbiHandler'; +import { useWallet } from 'AugmentedWallet'; +import { ActionBuilderCloseHandler } from 'utils/types'; +import { useActionBuilderState } from '../ActionBuilderStateProvider'; +import { Asset } from 'utils/Asset'; +import { constants } from 'ethers'; + +const functionSignature = 'function mint(address to, uint256 amount, bytes calldata context)'; + +enum Recipient { + Executor = 0, + Other = 1, +} + +export interface IMintToken { + recipient: Recipient; + recipientAddress: string; + mintAmount: string; +} + +type TokenMinterProps = { + onClick: ActionBuilderCloseHandler; +}; + +export const TokenMinter: React.FC = ({ onClick }) => { + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + + const context: any = useWallet(); + const { provider } = context; + const { dao } = useActionBuilderState(); + + const methods = useForm(); + const { control, handleSubmit, watch, getValues } = methods; + + const recipient = watch('recipient', 0); + + const submitActionData = useCallback(async () => { + const { recipientAddress, mintAmount } = getValues(); + const tokenRecipient = + recipient === Recipient.Executor ? dao?.executor.address : recipientAddress; + + const asset = await Asset.createFromAddress(dao?.token, mintAmount, provider); + const context = '0x'; + const values = [tokenRecipient, asset.amount, context]; + + const action = AbiHandler.mapToAction(functionSignature, dao?.minter, values); + onClick(action); + }, [onClick, getValues, dao, provider, recipient]); + + const validateAmount = useCallback( + async (value: string) => { + const asset = await Asset.createFromAddress(dao?.token, value, provider); + return validateAmountForDecimals(value, asset.decimals); + }, + [provider, dao], + ); + + return ( + + + Mint Tokens + Mint more DAO tokens + + + Who should receive minted tokens? + ( + + )} + /> + + + {recipient === Recipient.Executor ? ( + + Recipient address + The assets will be transfered to this address. + + + ) : ( + + ( + + )} + /> + + )} + + + ( + + )} + /> + + + + + + ); +}; diff --git a/packages/govern-console/src/components/AddressIdentifier/AddressIdentifier.tsx b/packages/govern-console/src/components/AddressIdentifier/AddressIdentifier.tsx new file mode 100644 index 000000000..82f789ce5 --- /dev/null +++ b/packages/govern-console/src/components/AddressIdentifier/AddressIdentifier.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { styled } from '@material-ui/core/styles'; +import MUIChip, { ChipProps } from '@material-ui/core/Chip'; +import Avatar from '@material-ui/core/Avatar'; +// import { ReactComponent as AddressIcon } from '../../../src/images/svgs/DefaultImageAddress.svg'; + +export interface AddressIdentifierProps extends ChipProps { + /** + * Image Url String + */ + imageUrl: string; + /** + * If Address or not + */ + isAddress: boolean; + /** + * User Name or Address + */ + displayText: string; + /** + * Size of the component + */ + componentSize: string; + onClick?: () => void; +} + +const StyledAddressIdentifier = styled(MUIChip)(({ theme }) => ({ + color: theme.custom.black, + backgroundColor: theme.custom.white, + width: 'fit-content', + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + padding: '6px 8px', + borderRadius: '40px', + cursor: 'pointer', +})); + +export const AddressIdentifier: React.FC = ({ + imageUrl, + isAddress, + displayText, + componentSize, +}) => { + const getDisplayText = () => { + if (isAddress) { + const formattedAddress = + displayText.slice(0, 5) + + '...' + + displayText.slice(displayText.length - 5, displayText.length - 1); + return formattedAddress; + } else { + let formattedName = displayText; + if (displayText.length > 20) { + formattedName = displayText.slice(0, 19); + } + return formattedName; + } + }; + + const getAvatar = () => { + if (imageUrl) { + return ; + } + return ; + }; + + return ( + + ); +}; diff --git a/packages/govern-console/src/components/AdviceMessages/AdviceMessage.tsx b/packages/govern-console/src/components/AdviceMessages/AdviceMessage.tsx new file mode 100644 index 000000000..22fe82649 --- /dev/null +++ b/packages/govern-console/src/components/AdviceMessages/AdviceMessage.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { styled, Theme } from '@material-ui/core/styles'; +import MUICard, { CardProps } from '@material-ui/core/Card'; +import MUITypography from '@material-ui/core/Typography'; + +export interface AdviceMessageProps extends CardProps { + /** + * Card Color + */ + cardColor: string; + /** + * Card Text + */ + messageText: string | React.ReactNode; + /** + * Optional Function Handler + */ + onClick?: () => void; +} + +const getBackground = (theme: Theme, cardColor: string) => { + if (cardColor === 'green') return `${theme.custom.light.grass}`; + if (cardColor === 'orange') return `${theme.custom.light.cream}`; + if (cardColor === 'blue') return `${theme.custom.light.sky}`; + if (cardColor === 'grey') return `${theme.custom.greyscale.light}`; +}; + +const getColor = (theme: Theme, cardColor: string) => { + if (cardColor === 'green') return `${theme.custom.informative.green}`; + if (cardColor === 'orange') return `${theme.custom.informative.orange}`; + if (cardColor === 'blue') return `${theme.custom.plain.sapphire}`; + if (cardColor === 'grey') return `${theme.custom.greyscale.solid}`; +}; + +const AdviceMessageCard = styled(MUICard)( + ({ theme, cardColor }: { theme: Theme; cardColor: string }) => ({ + backgroundColor: getBackground(theme, cardColor), + width: '293px', + height: 'fit-content', + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + padding: '16px 16px', + borderRadius: '10px', + }), +); + +const AdviceMessageText = styled(MUITypography)( + ({ theme, cardColor }: { theme: Theme; cardColor: string }) => ({ + color: getColor(theme, cardColor), + lineHeight: '19px', + fontSize: '14px', + fontWeight: 500, + fontFamily: 'Manrope', + fontStyle: 'normal', + overflow: 'visible', + }), +); + +export const AdviceMessage: React.FC = ({ cardColor, messageText }) => { + return ( + + {messageText} + + ); +}; diff --git a/packages/govern-console/src/components/Button.tsx b/packages/govern-console/src/components/Button.tsx deleted file mode 100644 index c4db3b7f7..000000000 --- a/packages/govern-console/src/components/Button.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react' -import 'styled-components/macro' - -export default function Button({ - children, - disabled = false, - onClick, - type, -}: React.ComponentProps<'button'>): JSX.Element { - return ( - - ) -} diff --git a/packages/govern-console/src/components/Button/ANButton.tsx b/packages/govern-console/src/components/Button/ANButton.tsx new file mode 100644 index 000000000..f493df939 --- /dev/null +++ b/packages/govern-console/src/components/Button/ANButton.tsx @@ -0,0 +1,185 @@ +import React from 'react'; +import { styled, Theme } from '@material-ui/core/styles'; +import MUIButton from '@material-ui/core/Button'; + +export interface ANButtonProps { + /** + * Button buttonType + */ + buttonType: string; + /** + * If you want to override the color + */ + backgroundColor?: string; + /** + * How large should the button be? + */ + size?: 'small' | 'medium' | 'large'; + /** + * Button contents + */ + label: string | React.ReactNode; + /** + * Optional click handler + */ + onClick?: () => void; + /** + * Disable button + */ + disabled?: boolean; + /** + * width + */ + width?: string; + /** + * height + */ + height?: string; + /** + * Color value + */ + labelColor?: string; + /** + * style + */ + style?: any; + /** + * Type of button + */ + type?: 'button' | 'submit'; +} + +const getBackground = ( + buttonType: string, + theme: Theme, + disabled?: boolean, + backgroundColor?: string, +) => { + if (disabled) return `${theme.custom.greyscale.light} !important`; + if (backgroundColor) return backgroundColor; + if (buttonType === 'primary') + return 'linear-gradient(107.79deg, #00C2FF 1.46%, #01E8F7 100%) !important'; + if (buttonType === 'challenge') + return 'linear-gradient(107.79deg, #F7B201 1.46%, #FF7A00 100%) !important'; + return '#ffffff !important'; +}; +const getBackgroundForHoveredState = ( + buttonType: string, + theme: Theme, + disabled?: boolean, + backgroundColor?: string, +) => { + if (disabled) return '#D9E0F5 !important'; + if (backgroundColor) return backgroundColor; + if (buttonType === 'primary') + return 'linear-gradient(107.79deg, #82E1FF 1.46%, #3CF3FF 100%) !important'; + if (buttonType === 'challenge') + return 'linear-gradient(107.79deg, #FFD056 1.46%, #FF9636 100%) !important'; + return '#ffffff !important'; +}; +const getBackgroundForPressedState = ( + buttonType: string, + theme: Theme, + disabled?: boolean, + backgroundColor?: string, +) => { + if (disabled) return '#D9E0F5 !important'; + if (backgroundColor) return backgroundColor; + if (buttonType === 'primary') + return 'linear-gradient(107.79deg, #01B9F2 1.46%, #01DBE9 100%) !important'; + if (buttonType === 'challenge') + return 'linear-gradient(107.79deg, #EBA900 1.46%, #ED7100 100%) !important'; + return '#EFF1F7 !important'; +}; + +const getColor = (buttonType: string, color?: string, disabled?: boolean) => { + if (disabled) return '#B0BDE5 !important'; + if (color && color !== '') return color; + if (buttonType === 'secondary') return '#20232C !important'; + return '#ffffff !important'; +}; + +const StyledButton = styled(MUIButton)( + ({ + theme, + buttonType, + backgroundColor, + disabled, + width, + height, + labelColor, + }: { + theme: Theme; + buttonType: string; + backgroundColor?: string; + size?: 'small' | 'medium' | 'large'; + onClick?: () => void; + disabled?: boolean; + width?: string; + height?: string; + labelColor?: string; + style?: any; + }) => ({ + color: getColor(buttonType, labelColor, disabled), + height: height || 46, + width: width || 154, + background: getBackground(buttonType, theme, disabled, backgroundColor), + boxSizing: 'border-box', + boxShadow: disabled ? 'none !important' : '0px 3px 3px rgba(116, 131, 178, 0.2)', + borderRadius: '8px', + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + fontSize: '16px', + lineHeight: '22px', + textTransform: 'none', + animation: 'none', + cursor: 'pointer', + transition: 'background 0.5s, color 0.5s', + '&:hover': { + background: getBackgroundForHoveredState(buttonType, theme, disabled, backgroundColor), + boxShadow: '0px 4px 4px rgba(116, 131, 178, 0.25)', + color: buttonType === 'secondary' ? '#7483B2' : 'white', + }, + '&:active': { + background: getBackgroundForPressedState(buttonType, theme, disabled, backgroundColor), + boxShadow: '0px 1px 1px rgba(116, 131, 178, 0.35)', + }, + '& .MuiTouchRipple-root': { + display: 'none', + }, + }), +); + +export const ANButton: React.FC = ({ + buttonType: buttonType = 'primary', + backgroundColor, + label, + disabled, + width, + height, + labelColor, + style, + ...props +}) => { + return ( + { + return; + } + : props.onClick + } + backgroundColor={backgroundColor} + disabled={disabled} + width={width} + buttonType={buttonType} + height={height} + labelColor={labelColor} + style={style} + > + {label} + + ); +}; diff --git a/packages/govern-console/src/components/Button/CloseButton.tsx b/packages/govern-console/src/components/Button/CloseButton.tsx new file mode 100644 index 000000000..e7e6119e9 --- /dev/null +++ b/packages/govern-console/src/components/Button/CloseButton.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import IconButton from '@material-ui/core/IconButton'; +import CloseIcon from '@material-ui/icons/Close'; +import { styled } from '@material-ui/core/styles'; + +const Button = styled(IconButton)(({ theme }) => ({ + position: 'absolute', + right: theme.spacing(1), + top: theme.spacing(1), + color: theme.palette.grey[500], +})); + +export interface CloseButtonProps { + onClick: () => void; +} + +export const CloseButton: React.FC = ({ onClick }) => { + return ( + + ); +}; diff --git a/packages/govern-console/src/components/Checkboxs/BlueCheckbox.tsx b/packages/govern-console/src/components/Checkboxs/BlueCheckbox.tsx new file mode 100644 index 000000000..3094be6fc --- /dev/null +++ b/packages/govern-console/src/components/Checkboxs/BlueCheckbox.tsx @@ -0,0 +1,17 @@ +import Checkbox, { CheckboxProps } from '@material-ui/core/Checkbox'; +import checkedIcon from '../../images/svgs/check_box_checked.svg'; +import unCheckedIcon from '../../images/svgs/check_box_unchecked.svg'; +import React from 'react'; + +export const BlueCheckbox: React.FC = ({ ...props }) => { + // export const BlueCheckbox = ({...props}) => { + return ( + } + icon={} + {...props} + /> + ); +}; diff --git a/packages/govern-console/src/components/CircularProgress/ANCircularProgress.tsx b/packages/govern-console/src/components/CircularProgress/ANCircularProgress.tsx new file mode 100644 index 000000000..4096932f1 --- /dev/null +++ b/packages/govern-console/src/components/CircularProgress/ANCircularProgress.tsx @@ -0,0 +1,82 @@ +import { makeStyles } from '@material-ui/core/styles'; +import CircularProgress, { CircularProgressProps } from '@material-ui/core/CircularProgress'; +import blueTickImage from '../../images/svgs/Blue_tick.svg'; +import crossImage from '../../images/svgs/cross.svg'; +import { CircularProgressStatus } from 'utils/types'; + +export interface ANCircularProgressProps extends CircularProgressProps { + /** + * Status of the Circular Progress + */ + status?: CircularProgressStatus; +} + +const useStyle = makeStyles({ + root: { + width: '19px', + height: '19px', + }, + circle: { + // TODO: linear gradient as svg is not correct + stroke: 'url(#linearColors)', + }, + inactiveCircle: { + stroke: '#B4C1E4', + }, +}); + +export const ANCircularProgress = (props: ANCircularProgressProps) => { + const classes = useStyle(); + + const getCircularProgress = () => { + return ( +
+ + + + + + + +
+ ); + }; + + switch (props.status) { + case CircularProgressStatus.Disabled: + return ( + + ); + case CircularProgressStatus.InProgress: + return getCircularProgress(); + + case CircularProgressStatus.Done: + return ; + + case CircularProgressStatus.Failed: + return ; + + default: + return getCircularProgress(); + } +}; diff --git a/packages/govern-console/src/components/CircularProgress/ANCircularProgressWithCaption.tsx b/packages/govern-console/src/components/CircularProgress/ANCircularProgressWithCaption.tsx new file mode 100644 index 000000000..3b5cea392 --- /dev/null +++ b/packages/govern-console/src/components/CircularProgress/ANCircularProgressWithCaption.tsx @@ -0,0 +1,59 @@ +import { ANCircularProgress } from './ANCircularProgress'; +import { CircularProgressStatus } from 'utils/types'; +import styled from 'styled-components'; +import { GU, StyledText, useTheme } from '@aragon/ui'; + +export interface ANProgressCationPropos { + /** + * Text Message to be showen along side of the circular progress + */ + caption?: string; + + /** + * Status of the circular progress + */ + state: CircularProgressStatus; +} + +const Container = styled.div` + display: flex; + flex-direction: row; + align-items: flex-start; +`; + +const Progress = styled.div` + margin-top: ${GU}px; +`; + +const Caption = styled.div` + margin-top: ${GU / 2}px; + margin-left: ${GU}px; + word-break: break-word; + color: ${(p) => p.color}; +`; + +export const ANCircularProgressWithCaption = (props: ANProgressCationPropos) => { + const theme = useTheme(); + + const getTextColor = (state: CircularProgressStatus) => { + switch (state) { + case CircularProgressStatus.Disabled: + return theme.disabledContent; + case CircularProgressStatus.Failed: + return theme.red; + default: + return theme.primary; + } + }; + + return ( + + + + + + {props.caption} + + + ); +}; diff --git a/packages/govern-console/src/components/ConsoleHeader/ConsoleHeader.tsx b/packages/govern-console/src/components/ConsoleHeader/ConsoleHeader.tsx new file mode 100644 index 000000000..452492a4d --- /dev/null +++ b/packages/govern-console/src/components/ConsoleHeader/ConsoleHeader.tsx @@ -0,0 +1,106 @@ +import React, { useState } from 'react'; +import { styled } from '@material-ui/core/styles'; +import MUICard from '@material-ui/core/Card'; +import MUITypography from '@material-ui/core/Typography'; +import { useHistory } from 'react-router-dom'; +import consoleHeaderGraphic from 'images/console-header.svg'; +import { Button, TextInput, Split, useLayout, useToast, SPACING, Link } from '@aragon/ui'; + +const ConsoleHeaderCard = styled(MUICard)(({ theme }) => ({ + background: theme.custom.daoHeader.background, + width: '100%', + height: 'min-content', + boxSizing: 'border-box', + boxShadow: 'none', + borderRadius: '16px', + display: 'flex', + justifyContent: 'space-between', +})); + +const Subtitle = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoHeader.labelColor, + lineHeight: '27px', + fontSize: '18px', + fontWeight: theme.custom.daoHeader.labelFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +const Title = styled(MUITypography)(({ theme }: any) => ({ + color: theme.custom.daoHeader.valueColor, + lineHeight: '60.1px', + fontSize: '44px', + fontWeight: theme.custom.daoHeader.valueFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +const ConsoleImage = styled('img')({ + height: '100%', + width: '400px', + marginRight: '160px', + marginTop: '60px', + marginBottom: '-10px', +}); + +export const ConsoleHeader: React.FC = () => { + const { layoutName } = useLayout(); + const toast = useToast(); + const history = useHistory(); + const [searchString, updateSearchString] = useState(''); + + const onInputChange = (event: any) => { + updateSearchString(event.target.value); + }; + + const onGotoDao = () => { + if (searchString.length > 0) { + history.push(`daos/${searchString}`); + } else { + toast('Invalid DAO Name. At least one letter should be entered.'); + } + }; + + const onEnterKey = (event: any) => { + if (event.key === 'Enter') { + onGotoDao(); + } + }; + + return ( + +
+
+ Welcome to Aragon Govern + + + Full-stack, frictionless DAOs: signal on{' '} + Voice, schedule on Govern, dispute in{' '} + Court. + + + + } + secondary={ +
+
+ {layoutName === 'large' && } +
+ ); +}; diff --git a/packages/govern-console/src/components/DaoCards/DaoCard.tsx b/packages/govern-console/src/components/DaoCards/DaoCard.tsx new file mode 100644 index 000000000..14df4deff --- /dev/null +++ b/packages/govern-console/src/components/DaoCards/DaoCard.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { styled } from '@material-ui/core/styles'; +import MUICard from '@material-ui/core/Card'; +import MUITypography from '@material-ui/core/Typography'; +import DaoProperty from './DaoProperty'; +export interface DaoCardProps { + /** + * Label of the card - name of the DAO + */ + label: string; + + /** + * Number of Proposals + */ + numberOfProposals: number; + /** + * function to be called on click. + */ + onClick?: () => void; +} + +const DaoCardWrapper = styled(MUICard)(({ theme }) => ({ + background: theme.custom.daoCard.background, + // width: '328px', + height: '161px', + border: `2px ${theme.custom.daoCard.border}`, + boxSizing: 'border-box', + boxShadow: '0px 6px 6px rgba(180, 193, 228, 0.35)', + justifyContent: 'center', + alignItems: 'center', + padding: '32px', + borderRadius: '8px', + display: 'flex', + flexDirection: 'column', + cursor: 'pointer', +})); + +const CardLabel = styled(MUITypography)(({ theme }) => ({ + lineHeight: theme.custom.daoCard.labelLineHeight, + fontSize: theme.custom.daoCard.labeFontSize, + fontWeight: theme.custom.daoCard.labelFontWeight, + fontFamily: theme.custom.daoCard.fontFamily, + fontStyle: theme.custom.daoCard.fontStyle, + background: theme.custom.daoCard.labelColor, + WebkitBackgroundClip: 'text', + WebkitTextFillColor: 'transparent', + paddingBottom: '35px', + overflow: 'hidden', + width: '100%', + textOverflow: 'ellipsis', + textAlign: 'center', +})); + +export const DaoCard: React.FC = ({ label, numberOfProposals }) => { + return ( + + {label} +
+
+ +
+
+
+ ); +}; diff --git a/packages/govern-console/src/components/DaoCards/DaoProperty.tsx b/packages/govern-console/src/components/DaoCards/DaoProperty.tsx new file mode 100644 index 000000000..35bca43a0 --- /dev/null +++ b/packages/govern-console/src/components/DaoCards/DaoProperty.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import MUITypography from '@material-ui/core/Typography'; +import { styled } from '@material-ui/core/styles'; + +interface DaoPropertyProps { + propertyLabel: string; + propertyText: string; +} + +const DaoPropertyLabel = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoCard.propertyLabelColor, + lineHeight: theme.custom.daoCard.propertyLabelLineHeight, + fontSize: theme.custom.daoCard.propertLabelFontSize, + fontWeight: theme.custom.daoCard.propertyLabelFontWeight, + fontFamily: theme.custom.daoCard.fontFamily, + fontStyle: theme.custom.daoCard.fontStyle, +})); +const DaoPropertyText = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoCard.propertyTextColor, + lineHeight: theme.custom.daoCard.propertyTextLineHeight, + fontSize: theme.custom.daoCard.propertyTextFontSize, + fontWeight: theme.custom.daoCard.propertyTextFontWeight, + fontFamily: theme.custom.daoCard.fontFamily, + fontStyle: theme.custom.daoCard.fontStyle, +})); + +const DaoProperty: React.FC = ({ propertyLabel, propertyText }) => { + return ( +
+ {propertyLabel} + {propertyText} +
+ ); +}; + +export default DaoProperty; diff --git a/packages/govern-console/src/components/DaoHeader/DaoHeader.tsx b/packages/govern-console/src/components/DaoHeader/DaoHeader.tsx new file mode 100644 index 000000000..86ac94f5e --- /dev/null +++ b/packages/govern-console/src/components/DaoHeader/DaoHeader.tsx @@ -0,0 +1,116 @@ +import React, { useState, useCallback } from 'react'; +import { useHistory } from 'react-router-dom'; +import { styled } from '@material-ui/core/styles'; +import MUICard from '@material-ui/core/Card'; +import MUITypography from '@material-ui/core/Typography'; +import { settingsUrl } from 'utils/urls'; +import { Button, IconSettings, Grid, useToast } from '@aragon/ui'; +import { ActionBuilder } from 'components/ActionBuilder/ActionBuilder'; +import { useWallet } from 'AugmentedWallet'; +import { Error } from 'utils/Error'; +import { trackEvent, EventType } from 'services/analytics'; + +export interface DaoHeaderProps { + /** + * Label of the card - name of the DAO + */ + daoName: string; +} + +const DaoHeaderCard = styled(MUICard)(({ theme }) => ({ + background: theme.custom.daoHeader.background, + width: '100%', + height: '197px', + paddingLeft: '64px', + paddingTop: '54px', + paddingBottom: '53px', + boxShadow: 'none', + boxSizing: 'border-box', +})); + +const HeaderLabel = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoHeader.labelColor, + lineHeight: theme.custom.daoHeader.labelLineHeight, + fontSize: theme.custom.daoHeader.labelFontSize, + fontWeight: theme.custom.daoHeader.labelFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +const HeaderValue = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoHeader.valueColor, + lineHeight: theme.custom.daoHeader.valueLineHeight, + fontSize: theme.custom.daoHeader.valueFontSize, + fontWeight: theme.custom.daoHeader.valueFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +export const DaoHeader: React.FC = ({ daoName }) => { + const history = useHistory(); + const [isDepositDialogOpen, setDepositDialogOpen] = useState(false); + + const context: any = useWallet(); + const { isConnected } = context; + const toast = useToast(); + + const goToSettingPage = () => { + history.push(settingsUrl(daoName)); + }; + + const openDepositDialog = useCallback(() => { + if (!isConnected) { + toast(Error.ConnectAccount); + return; + } + if (daoName) { + trackEvent(EventType.DEPOSIT_ASSETS_ClICKED, { dao_name: daoName }); + } + + setDepositDialogOpen(true); + }, [setDepositDialogOpen, toast, isConnected, daoName]); + + return ( + +
+
+ DAO identifier + {daoName} +
+ + + + +
+ {isDepositDialogOpen && ( + setDepositDialogOpen(false)} + > + )} +
+ ); +}; diff --git a/packages/govern-console/src/components/Dialog/Dialog.tsx b/packages/govern-console/src/components/Dialog/Dialog.tsx new file mode 100644 index 000000000..97debf378 --- /dev/null +++ b/packages/govern-console/src/components/Dialog/Dialog.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import { CloseButton } from 'components/Button/CloseButton'; +import { ANWrappedPaper } from 'components/WrapperPaper/ANWrapperPaper'; +import { styled } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; +import { Button } from '@aragon/ui'; + +export interface DialogProps { + /** + * title of the dialog + */ + title: string; + + /** + * sub title of the dialog + */ + subTitle?: string; + + /** + * image to be displayed on the dialog + */ + image?: string; + + /** + * button handler and label + */ + button?: { + label: string; + onClick: () => void; + }; + + /** + * close button handler + */ + onClose?: () => void; + + /** + * paper style dialog + */ + paperStyle?: boolean; +} + +const Title = styled(Typography)(({ theme }) => ({ + ...theme.custom.transactionKeeper.title, + textAlign: 'center', + marginBottom: '21px', +})); + +const DialogWrapper = styled('div')({ + margin: '32px', + borderRadius: '16px', + width: '440px', +}); + +const SubTitle = styled('div')({ + fontSize: 18, + lineHeight: '25px', + color: '#7483AB', + textAlign: 'center', + margin: '0 auto', +}); + +const Image = styled('img')({ + position: 'relative', + display: 'block', + width: '70', + margin: '0 auto', + paddingBottom: '10px', +}); + +const Dialog: React.FC = ({ + title, + subTitle, + image, + button, + onClose, + children, + paperStyle, +}) => { + const Content = () => { + return ( + <> + {onClose ? : null} + {image && } + {title} + {subTitle && {subTitle}} + {children} + {button && ( +
+
+ )} + + ); + }; + + if (paperStyle) { + return ( + + + + ); + } else { + return ( + + + + ); + } +}; + +export default Dialog; diff --git a/packages/govern-console/src/components/Dialog/FailureDialog.tsx b/packages/govern-console/src/components/Dialog/FailureDialog.tsx new file mode 100644 index 000000000..6c03b279f --- /dev/null +++ b/packages/govern-console/src/components/Dialog/FailureDialog.tsx @@ -0,0 +1,92 @@ +import React, { useState } from 'react'; +import { styled } from '@material-ui/core/styles'; +import { Collapse } from '@material-ui/core'; +import Dialog from './Dialog'; +import CrossImage from '../../images/svgs/cross.svg'; + +export interface FailureDialogProps { + /** + * Dialog sub title + */ + subTitle?: string; + + /** + * more details about the error + */ + moreDetails?: string; + + /** + * button click handler + */ + onClick(): void; + + /** + * render the dialog with paper style or plain dialog style + */ + paperStyle?: boolean; +} + +const defaultSubTitle = + 'An error has occurred during the signature process. Do not worry, you can try again without losing your information.'; + +const DetailsContainer = styled('div')({ + maxWidth: '400px', + margin: '0 auto', + textAlign: 'center', + paddingTop: '5px', +}); + +const Details = styled('div')({ + fontSize: '12px', + fontStyle: 'normal', + lineHeight: '16px', + letterSpacing: '0.02em', + textAlign: 'left', + marginTop: '19px', + overflowY: 'scroll', + maxHeight: '86px', + color: '#7483AB', + wordWrap: 'break-word', +}); + +const Link = styled('a')({ + textDecoration: 'none', + color: '#00C2FF', + fontSize: '18px', + fontStyle: 'normal', + cursor: 'pointer', +}); + +const FailureDialog: React.FC = ({ + subTitle, + moreDetails, + onClick, + paperStyle, +}) => { + const [showDetails, setShowDetails] = useState(false); + + const toggleShow = () => { + setShowDetails((prev) => !prev); + }; + + return ( + + {moreDetails && ( + + {'More details'} + +
{moreDetails}
+
+
+ )} +
+ ); +}; + +export default FailureDialog; diff --git a/packages/govern-console/src/components/Dialog/SuccessDialog.tsx b/packages/govern-console/src/components/Dialog/SuccessDialog.tsx new file mode 100644 index 000000000..ec0980c7d --- /dev/null +++ b/packages/govern-console/src/components/Dialog/SuccessDialog.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import Dialog from './Dialog'; +import GreenTickImage from 'images/svgs/green_tick.svg'; + +export interface SuccessDialogProps { + /** + * Dialog title + */ + title: string; + + /** + * Dialog sub title + */ + subTitle: string; + + /** + * label on the button + */ + buttonLabel: string; + + /** + * button click handler + */ + onClick: () => void; + + /** + * render the dialog with paper style or plain dialog style + */ + paperStyle?: boolean; +} + +const SuccessDialog: React.FC = ({ + title, + subTitle, + buttonLabel, + onClick, + paperStyle, +}) => { + return ( + + ); +}; + +export default SuccessDialog; diff --git a/packages/govern-console/src/components/Dialog/TransactionDialog.tsx b/packages/govern-console/src/components/Dialog/TransactionDialog.tsx new file mode 100644 index 000000000..f5025ee84 --- /dev/null +++ b/packages/govern-console/src/components/Dialog/TransactionDialog.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import Dialog from './Dialog'; +import { CustomTransaction } from 'utils/types'; +import TransactionList from './TransactionList'; +import { Info } from '@aragon/ui'; + +export interface TransactionDialogProps { + /** + * Dialog title + */ + title: string; + + /** + * label for the main button + */ + buttonLabel?: string; + + /** + * message + */ + info?: string; + + /** + * transactions to show on the dialog box + */ + transactions: CustomTransaction[]; + + /** + * button click handler + */ + onClick?: () => void; + + /** + * dialog close handler + */ + onClose?: () => void; +} + +const TransactionDialog: React.FC = ({ + title, + info, + transactions, + buttonLabel, + onClick, + onClose, +}) => { + const button = onClick + ? { + onClick, + label: buttonLabel || 'Continue', + } + : undefined; + + return ( + + + {info && ( + + {info} + + )} + + ); +}; + +export default TransactionDialog; diff --git a/packages/govern-console/src/components/Dialog/TransactionList.tsx b/packages/govern-console/src/components/Dialog/TransactionList.tsx new file mode 100644 index 000000000..e8741217d --- /dev/null +++ b/packages/govern-console/src/components/Dialog/TransactionList.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { CustomTransaction, CustomTransactionStatus } from 'utils/types'; +import { ANCircularProgressWithCaption } from 'components/CircularProgress/ANCircularProgressWithCaption'; +import { CircularProgressStatus } from 'utils/types'; +import { GU, RADII } from '@aragon/ui'; +import styled from 'styled-components'; + +export interface TransactionListProps { + transactions: CustomTransaction[]; +} + +const Container = styled.div` + background: #f6f9fc; + padding: ${2 * GU}px; + border-radius: ${RADII['small']}px; + margin: auto; + width: 100%; +`; + +const TransactionListWrapper = styled.ul` + padding-inline-start: 0; + list-style: none; +`; + +const TransactionListItem = styled.li` + padding: 0; +`; + +const TransactionList: React.FC = ({ transactions }) => { + const getListItem = (transaction: CustomTransaction) => { + switch (transaction.status) { + case CustomTransactionStatus.Pending: + return ( + + ); + case CustomTransactionStatus.InProgress: + return ( + + ); + case CustomTransactionStatus.Successful: + return ( + + ); + case CustomTransactionStatus.Failed: + return ( + + ); + } + }; + return ( + + + {transactions.map((transaction) => { + return ( + + {getListItem(transaction)} + + ); + })} + + + ); +}; + +export default React.memo(TransactionList); diff --git a/packages/govern-console/src/components/Dropdown/Dropdown.tsx b/packages/govern-console/src/components/Dropdown/Dropdown.tsx new file mode 100644 index 000000000..b393522f7 --- /dev/null +++ b/packages/govern-console/src/components/Dropdown/Dropdown.tsx @@ -0,0 +1,106 @@ +import React, { useState } from 'react'; +import { deepPurple } from '@material-ui/core/colors'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; +import Select from '@material-ui/core/Select'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; + +// Original design here: https://github.com/siriwatknp/mui-treasury/issues/541 + +export const Dropdown: React.FC = ({ ...props }) => { + const theme = useTheme(); + const aaragonDropDownStyles = makeStyles({ + select: { + minWidth: 567, + background: theme.custom.white, + color: theme.custom.black, + fontWeight: 400, + border: `1px solid ${theme.custom.greyscale.soft}`, + borderRadius: 8, + padding: '13px 16px', + '&:focus': { + borderRadius: 8, + background: 'white', + borderColor: `${theme.custom.greyscale.soft}`, + }, + }, + icon: { + color: `${theme.custom.black}`, + right: 19, + position: 'absolute', + userSelect: 'none', + pointerEvents: 'none', + }, + paper: { + borderRadius: 8, + marginTop: 8, + }, + list: { + padding: '0px', + background: 'white', + border: `1px solid ${theme.custom.greyscale.soft}`, + '& li': { + fontWeight: 400, + padding: '13px 16px', + }, + '& li:hover': { + background: `${theme.custom.greyscale.light}`, + color: `${theme.custom.black}`, + }, + '& li.Mui-selected': { + color: `${theme.custom.black}`, + background: `${theme.custom.greyscale.light}`, + borderBottom: `1px solid ${theme.custom.greyscale.soft}`, + }, + '& li.Mui-selected:hover': { + background: `${theme.custom.greyscale.light}`, + }, + }, + }); + const classes = aaragonDropDownStyles(); + const [val, setVal] = useState(1); + + const handleChange = (event: any) => { + setVal(event.target.value); + }; + + const iconComponent = (props: any) => { + return ; + }; + + // moves the menu below the select input + const menuProps = { + classes: { + paper: classes.paper, + list: classes.list, + }, + anchorOrigin: { + vertical: 'bottom', + horizontal: 'left', + }, + transformOrigin: { + vertical: 'top', + horizontal: 'left', + }, + getContentAnchorEl: null, + }; + + return ( + + + + ); +}; diff --git a/packages/govern-console/src/components/Entity/Entity.tsx b/packages/govern-console/src/components/Entity/Entity.tsx deleted file mode 100644 index 87b2d7c86..000000000 --- a/packages/govern-console/src/components/Entity/Entity.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react' -import 'styled-components/macro' -import { cid as isCid } from 'is-ipfs' -import { hexToUtf8, isAddress } from 'web3-utils' -import { useChainId } from '../../lib/chain-id' -import { shortenAddress } from '../../lib/web3-utils' -import { RINKEBY } from '../../lib/known-chains' - -type EntityProps = { - address: string - type: 'address' | 'tx' - shorten?: boolean -} - -function composeEtherscanLink( - address: string, - chainId: number, - type: string, -): string { - return `https://${ - chainId === RINKEBY ? 'rinkeby.' : '' - }etherscan.io/${type}/${address}` -} - -function composeIpfsLink(cid: string): string { - return `https://ipfs.fleek.co/ipfs/${cid}` -} - -function detectAndComposeLinkType( - hash: string, - chainId: number, - type: string, -): string[] { - try { - if (isAddress(hash)) { - return [composeEtherscanLink(hash, chainId, type), 'ethereum'] - } - - if (isCid(hexToUtf8(hash))) { - return [composeIpfsLink(hexToUtf8(hash)), 'ipfs'] - } - } catch (err) { - return ['', ''] - } - - return ['', ''] -} - -function formatAddress( - address: string, - { shorten }: { shorten: boolean }, -): string { - try { - if (isAddress(address)) { - return shorten ? shortenAddress(address) : address - } - - if (isCid(hexToUtf8(address))) { - return hexToUtf8(address) - } - } catch (err) { - // Won't be a valid string anyway, so we return it - return address.length > 42 ? `${address.slice(0, 43)}...` : address - } - - // In this case, it's possible that it's really just plain text, so we decode it anyways. - return hexToUtf8(address) -} - -export default function Entity({ - address, - shorten = false, - type, -}: EntityProps): JSX.Element { - const { chainId } = useChainId() - const [url] = detectAndComposeLinkType(address, chainId, type) - return url ? ( - - {formatAddress(address, { shorten })} - - ) : ( - {address.length > 42 ? `${address.slice(0, 43)}...` : address} - ) -} diff --git a/packages/govern-console/src/components/Field/Field.tsx b/packages/govern-console/src/components/Field/Field.tsx new file mode 100644 index 000000000..b8d9ab862 --- /dev/null +++ b/packages/govern-console/src/components/Field/Field.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { styled } from '@material-ui/core/styles'; +// import { isIPFShash } from 'utils/ipfs'; +interface FieldProps { + value: string; + inline: boolean; + width?: string; + height?: string; +} +const InlineField = styled('div')({ + display: 'inline', +}); +const BlockField = styled('div')(({ width, height }: { width?: string; height?: string }) => ({ + display: 'block', + width: width ? width : 'fit-content', + height: height ? height : 'fit-content', +})); +const StyledLink = styled('a')({ + display: 'inline', + width: 'fit-content', + height: 'fit-content', +}); +const Field: React.FC = ({ value, inline }) => { + return ( + <> + {/* {inline ? ( + + {isIPFShash(value) ? ( + + See link + + ) : ( + value + )} + + ) : ( + + {isIPFShash(value) ? ( + + See link + + ) : ( + value + )} + */} + ) + + ); +}; +export default Field; diff --git a/packages/govern-console/src/components/Field/IPFSField.tsx b/packages/govern-console/src/components/Field/IPFSField.tsx new file mode 100644 index 000000000..63b79e05f --- /dev/null +++ b/packages/govern-console/src/components/Field/IPFSField.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { toUTF8String } from 'utils/lib'; +import { ipfsMetadata } from 'utils/types'; +import { ANCircularProgressWithCaption } from 'components/CircularProgress/ANCircularProgressWithCaption'; +import { CircularProgressStatus } from 'utils/types'; + +interface FieldProps { + value: (ipfsMetadata & string) | undefined; + loading?: boolean; +} + +export const IPFSField: React.FC = ({ value, loading, ...props }) => { + return ( +
+ {(() => { + if (loading) { + return ; + } + + if (typeof value === 'undefined') { + return <>; + } + + if (value == '0x') { + return
Empty
; + } + + if (typeof value === 'string') { + return
{toUTF8String(value) || `can't be decoded: ${value}`}
; + } + + return value?.text ? ( + + {value.text} + + ) : ( + value?.endpoint && ( + + View + + ) + ); + })()} +
+ ); +}; diff --git a/packages/govern-console/src/components/Field/IPFSInput.tsx b/packages/govern-console/src/components/Field/IPFSInput.tsx new file mode 100644 index 000000000..dd72faba0 --- /dev/null +++ b/packages/govern-console/src/components/Field/IPFSInput.tsx @@ -0,0 +1,181 @@ +import React, { ReactNode } from 'react'; +import { useFormContext, Controller } from 'react-hook-form'; +import { useLayout, TextInput, SPACING, ContentSwitcher, FileInput } from '@aragon/ui'; +import { toUtf8String } from 'ethers/lib/utils'; +import { useEffect } from 'react'; +import { ipfsMetadata } from 'utils/types'; +import { validateFileSize } from 'utils/validations'; + +export interface IPFSInputProps { + /** + * to be removed + */ + label?: string; + /** + * Title of the field + */ + title?: string; + /** + * Sub Title of the field + */ + subtitle?: ReactNode | string; + /** + * Placeholder + */ + placeholder?: string; + /** + * name of the text type input field in the controller. + */ + textInputName: string; + /** + * name of the file type input field. + */ + fileInputName: string; + /** + * Optional param to detect if the file is chosen(true) or text field(false) + * Works well with shouldUnregister prop. + * + * If shouldUnregister is false, isFile prop is needed so + * parent can track which type was chosen. + * + * If shouldUnregister is true(default), isFile prop is not needed + * and parent can directly check first the file on getValues. + * In case it's undefined, it means it was text that user chose. + */ + isFile?: string; + /** + * Whether or not unregister field after changing checkbox value. + * If user put something in text field and then switched to file type, + * and then came back to text field, value will not be preserved + */ + shouldUnregister?: boolean; + /** + * IPFS gateway url of the file. + */ + ipfsMetadata?: ipfsMetadata; + /** + * Optional number of rows/lines for textarea if free text is chosen for component + */ + rows?: number; +} + +export const IPFSInput: React.FC = ({ + title, + subtitle, + textInputName, + fileInputName, + isFile, + shouldUnregister = true, + ipfsMetadata, + placeholder, + rows, +}) => { + const { control, watch, setValue } = useFormContext(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + const isFileChosen = isFile || `is_file_${fileInputName}`; + + const formatValue = (value: any) => { + if (value && typeof value !== 'string') { + return Object.keys(value).map((key) => ({ + // status: 'loading', + name: value[Number(key)].name, + url: null, + })); + } else if (ipfsMetadata?.endpoint && !ipfsMetadata?.text) { + return [ + { + // status: ipfsURI && 'success', + name: ipfsMetadata.endpoint && 'Current file:', + url: ipfsMetadata.endpoint && ipfsMetadata.endpoint, + }, + ]; + } + }; + + useEffect(() => { + if (ipfsMetadata?.text) { + setValue(textInputName, ipfsMetadata.text); + } else if (ipfsMetadata?.endpoint) { + setValue(isFileChosen, true); + setValue(fileInputName, ipfsMetadata.endpoint); + } + }, [setValue, ipfsMetadata, isFileChosen, textInputName, fileInputName]); + + return ( +
+
+ ( + + )} + /> +
+ {!watch(isFileChosen) ? ( + ( + + )} + /> + ) : ( + validateFileSize(value, 20), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + )} +
+ ); +}; diff --git a/packages/govern-console/src/components/Field/JSONField.tsx b/packages/govern-console/src/components/Field/JSONField.tsx new file mode 100644 index 000000000..8ea49218b --- /dev/null +++ b/packages/govern-console/src/components/Field/JSONField.tsx @@ -0,0 +1,61 @@ +import React from 'react'; + +interface JSONFieldProps { + json: any; + replacement?: Record; +} + +type JSONElementProps = { + label: string; + value: any; + indent?: boolean; +}; + +const JSONElement: React.FC = ({ label, value, indent }) => { + const style = indent ? { paddingLeft: '15px' } : undefined; + return ( +
+ {JSON.stringify(label)}: {value} +
+ ); +}; + +export const JSONField: React.FC = ({ json, replacement }) => { + if (Array.isArray(json)) { + return ( + <> + {'['} + {json.map((val, i) => ( + + ))} + {']'} + + ); + } + + if (typeof json === 'object') { + return ( + <> + {'{'} + {Object.entries(json).map(([label, value], i) => { + const valueComponent = + replacement && replacement[label] ? ( + replacement[label] + ) : ( + + ); + + return ; + })} + {'}'} + + ); + } + + return ( + <> + {JSON.stringify(json)} + {','} + + ); +}; diff --git a/packages/govern-console/src/components/FilteredActions/FilteredActions.tsx b/packages/govern-console/src/components/FilteredActions/FilteredActions.tsx deleted file mode 100644 index 1439a1c14..000000000 --- a/packages/govern-console/src/components/FilteredActions/FilteredActions.tsx +++ /dev/null @@ -1,223 +0,0 @@ -import React, { useCallback, useMemo, useState } from 'react' -import { useHistory, useParams } from 'react-router-dom' -import { fromUnixTime } from 'date-fns' -import 'styled-components/macro' -import { shortenAddress } from '../../lib/web3-utils' - -type FilteredActionsProps = { - actions: any[] - actionsPerPage: number -} - -export default function FilteredActions({ - actions, - actionsPerPage, -}: FilteredActionsProps): JSX.Element { - const [selected, setSelected] = useState(0) - const [selectedFilter, setSelectedFilter] = useState< - 'Executed' | 'Scheduled' | 'All' - >('All') - const handleChangeFilter = useCallback( - (filterValue: string) => { - if ( - filterValue !== 'All' && - filterValue !== 'Executed' && - filterValue !== 'Scheduled' - ) { - throw new Error('Invalid filter') - } - setSelectedFilter(filterValue) - }, - [setSelectedFilter], - ) - const first = useMemo(() => selected * actionsPerPage, [ - selected, - actionsPerPage, - ]) - const last = useMemo( - () => - Math.min(actions.length || 0, selected * actionsPerPage + actionsPerPage), - [actionsPerPage, actions, selected], - ) - - const filteredActions = actions.filter((action: any) => { - if (selectedFilter === 'All' || action.state === selectedFilter) { - return true - } - - return false - }) - - const pages = useMemo( - () => Math.ceil(filteredActions.length / actionsPerPage), - [filteredActions, actionsPerPage], - ) - - const filteredAndPaginatedActions = filteredActions.slice(first, last) - const paginationItems = useMemo(() => [...Array(pages)].map((_, i) => i), [ - pages, - ]) - - const hasActions = useMemo(() => actions.length > 0, [actions]) - - return ( -
- -
- {hasActions && - filteredAndPaginatedActions - .reverse() - .sort((a, b) => { - return b.payload.executionTime - a.payload.executionTime - }) - .map((action: any) => ( - - ))} -
-
div + div { - margin-left: 8px; - } - `} - > - {paginationItems.map((idx: number) => ( - setSelected(idx)} key={idx}> - {idx + 1} - - ))} -
-
- ) -} - -type PaginationItemProps = { - children: React.ReactNode - onClick: () => void -} -function PaginationItem({ children, onClick }: PaginationItemProps) { - return ( - - ) -} - -type ActionCardProps = { - executionTime: string - id: string - state: string -} - -function ActionCard({ executionTime, id, state }: ActionCardProps) { - const history = useHistory() - const { daoAddress }: any = useParams() - - const handleCardClick = useCallback(() => { - history.push(`${daoAddress}/view-action/${id}`) - }, [daoAddress, history, id]) - - return ( -
-
- {shortenAddress(id)} -
-
- {state} -
- {fromUnixTime(Number(executionTime)).toLocaleDateString('en-US')} -
- ) -} diff --git a/packages/govern-console/src/components/Footer/Footer.tsx b/packages/govern-console/src/components/Footer/Footer.tsx new file mode 100644 index 000000000..26fe43919 --- /dev/null +++ b/packages/govern-console/src/components/Footer/Footer.tsx @@ -0,0 +1,96 @@ +import { styled } from '@material-ui/core/styles'; +import AragonIcon from 'images/aragon-graphic-only-icon.svg'; +import aragonText from 'images/svgs/Aragon.svg'; +import discordIcon from 'images/svgs/discord.svg'; +import messageIcon from 'images/svgs/message.svg'; +import twitterIcon from 'images/svgs/twitter.svg'; +import telegramIcon from 'images/svgs/telegrama.svg'; +import { useHistory } from 'react-router-dom'; +import { Grid, GridItem, useLayout, Link, StyledText } from '@aragon/ui'; + +const Logo = styled('div')({ + display: 'flex', + flexDirection: 'row', + width: 'fit-content', + cursor: 'pointer', +}); +const Social = styled('div')({ + display: 'flex', + width: 'auto', + flexDirection: 'row', + justifyContent: 'flex-end', +}); + +const Footer = ({}) => { + const history = useHistory(); + const { layoutName } = useLayout(); + const redirectToHomePage = () => { + history.push('/'); + }; + + return ( + + + + + + + + + + Need more information about Aragon? Visit{' '} + + our homepage + + .{' '} + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Footer; diff --git a/packages/govern-console/src/components/Frame/Frame.tsx b/packages/govern-console/src/components/Frame/Frame.tsx deleted file mode 100644 index 2e2ffa42d..000000000 --- a/packages/govern-console/src/components/Frame/Frame.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react' -import 'styled-components/macro' - -type FrameProps = { - children: React.ReactNode -} - -export default function Frame({ children }: FrameProps): JSX.Element { - return ( -
- {children} -
- ) -} diff --git a/packages/govern-console/src/components/Header/Header.tsx b/packages/govern-console/src/components/Header/Header.tsx index d658a927c..a4e527e00 100644 --- a/packages/govern-console/src/components/Header/Header.tsx +++ b/packages/govern-console/src/components/Header/Header.tsx @@ -1,127 +1,74 @@ -import React, { useCallback, useEffect } from 'react' -import { ChainUnsupportedError } from 'use-wallet' -import 'styled-components/macro' -import Button from '../Button' -import { useChainId } from '../../lib/chain-id' -import { useWallet } from '../../Providers/Wallet' -import { useRouting } from '../../lib/routing' -import { shortenAddress, getNetworkName } from '../../lib/web3-utils' -import AragonSvg from '../../assets/aragon-metal.svg' +import governIcon from 'images/svgs/aragon-icon.svg'; +import Wallet from 'components/Wallet/Wallet'; +import { useHistory } from 'react-router-dom'; +import { Button, StyledText, IconCirclePlus, useLayout, GU, Tag } from '@aragon/ui'; +import styled from 'styled-components'; +import { networkEnvironment } from 'environment'; +import { trackEvent, EventType } from 'services/analytics'; -function Header(): JSX.Element { - const { goHome } = useRouting() - const { chainId, updateChainId } = useChainId() - const { wallet } = useWallet() +const NavBar = styled.nav` + display: flex; + flex-direction: row: + gap: 16px; + padding: 8px; +`; - useEffect(() => { - if (wallet.error && wallet.error instanceof ChainUnsupportedError) { - alert( - `Wrong network. Please connect to the ${getNetworkName( - chainId, - )} network.`, - ) - } - }, [chainId, wallet]) +const Title = styled.div` + display: flex; + width: fit-content; + cursor: pointer; + align-items: center; + column-gap: ${GU}px; +`; - const handleChangeChain = useCallback( - (event: { target: { value: string } }) => { - updateChainId(Number(event.target.value)) - }, - [updateChainId], - ) +const RigtSideContainer = styled.div` + display: flex; + width: 100%; + flex-wrap: nowrap; + flex-direction: row; + justify-content: flex-end; + align-items: center; + gap: 10px; +`; - const handleWalletConnection = useCallback(() => { - wallet.status === 'connected' ? wallet.reset() : wallet.connect('injected') - }, [wallet]) +const Header = () => { + const { layoutName } = useLayout(); + const history = useHistory(); + const { networkName } = networkEnvironment; + + const redirectToHomePage = () => { + history.push('/'); + }; + + const goToCreateDaoPage = () => { + // analytics + trackEvent(EventType.NAVBAR_CREATEDAO_CLICKED, { network: networkName }); + + history.push('/create-dao'); + }; return ( -
-
- -
-
- + + + <img src={governIcon} width={layoutName !== 'small' ? '182px' : '162px'} /> + <Tag mode="activity" size="normal" uppercase={false} label="Beta" /> + + + {layoutName !== 'small' && ( + Network:{networkName.toUpperCase()} + )} + -
-
- ) -} + size={'large'} + onClick={goToCreateDaoPage} + label={'Create DAO'} + icon={} + display={layoutName === 'small' ? 'icon' : 'label'} + disabled={status === 'connecting'} + /> + + + ); +}; -export default Header +export default Header; diff --git a/packages/govern-console/src/components/HelpButton/HelpButton.tsx b/packages/govern-console/src/components/HelpButton/HelpButton.tsx new file mode 100644 index 000000000..d332ddaf4 --- /dev/null +++ b/packages/govern-console/src/components/HelpButton/HelpButton.tsx @@ -0,0 +1,54 @@ +import React, { ReactChild, ReactFragment, ReactPortal } from 'react'; +import { styled } from '@material-ui/core/styles'; +import Button, { ButtonProps } from '@material-ui/core/Button'; +import MuiTooltip from '@material-ui/core/Tooltip'; +import helpIcon from '../../images/ds/help-icon.svg'; + +export interface HelpButtonProps extends ButtonProps { + /** + * Help text to show on hover + */ + helpText: boolean | ReactChild | ReactFragment | ReactPortal; +} + +const HelpButtonDiv = styled(Button)({ + height: 16, + width: 16, + minWidth: 16, + background: '#635BFF', + filter: 'drop-shadow(0px 3px 3px rgba(116, 131, 178, 0.25))', + boxSizing: 'border-box', + boxShadow: '0px 3px 3px 0px rgba(116, 131, 178, 0.25)', + borderRadius: '50%', + textTransform: 'none', + animation: 'none', + transition: 'none', + '&:hover': { + background: '#8991FF', + boxShadow: '0px 6px 6px rgba(180, 193, 228, 0.35)', + }, + '& .MuiTouchRipple-root': { + display: 'none', + }, +}); + +const HelpToolTip = styled(MuiTooltip)(({ theme }) => ({ + '& .MuiTooltip-popper': { + maxWidth: 300, + background: theme.custom.light.violet, + }, + '& .MuiTooltip-tooltip': { + background: theme.custom.light.violet, + color: theme.custom.plain.amethyst, + }, +})); + +export const HelpButton: React.FC = ({ helpText }) => { + return ( + + + + + + ); +}; diff --git a/packages/govern-console/src/components/HelpComponent/HelpComponent.tsx b/packages/govern-console/src/components/HelpComponent/HelpComponent.tsx new file mode 100644 index 000000000..4073a8447 --- /dev/null +++ b/packages/govern-console/src/components/HelpComponent/HelpComponent.tsx @@ -0,0 +1,60 @@ +import { + Box, + Button, + StyledText, + useLayout, + useTheme, + Grid, + GridItem, + GU, + RADII, +} from '@aragon/ui'; +import helpFaceImage from 'images/pngs/help_face_@2x.png'; +import { ARAGON_HELP_URL } from '../../utils/constants'; + +function HelpComponent() { + const theme = useTheme(); + const { layoutName } = useLayout(); + + return ( + + + + + + + Need help? + + Ask us anything, or share your feedback + + + + + + + ); +} + +export default HelpComponent; diff --git a/packages/govern-console/src/components/Hint/Hint.tsx b/packages/govern-console/src/components/Hint/Hint.tsx new file mode 100644 index 000000000..e72f425c6 --- /dev/null +++ b/packages/govern-console/src/components/Hint/Hint.tsx @@ -0,0 +1,21 @@ +import React, { ReactNode } from 'react'; +import { textStyle, useTheme } from '@aragon/ui'; + +type HintProps = { + children: ReactNode; +}; + +export const Hint: React.FC = ({ children }) => { + const theme = useTheme(); + + return ( +
+ {children} +
+ ); +}; diff --git a/packages/govern-console/src/components/Info/Info.tsx b/packages/govern-console/src/components/Info/Info.tsx deleted file mode 100644 index 9fb11dcb2..000000000 --- a/packages/govern-console/src/components/Info/Info.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react' -import 'styled-components/macro' - -type InfoProps = { - mode: 'error' | 'info' | 'success' | '' - children: React.ReactNode -} - -function resolveColorsFromStatus(mode: string): string { - if (mode === 'error') { - return 'red' - } - if (mode === 'success') { - return 'green' - } - return 'cyan' -} - -export default function Info({ mode, children }: InfoProps): JSX.Element { - return ( -
- {children} -
- ) -} diff --git a/packages/govern-console/src/components/InputFields/InputField.tsx b/packages/govern-console/src/components/InputFields/InputField.tsx new file mode 100644 index 000000000..9bc015afa --- /dev/null +++ b/packages/govern-console/src/components/InputFields/InputField.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; +import TextField, { StandardTextFieldProps } from '@material-ui/core/TextField'; + +export interface InputFieldProps extends StandardTextFieldProps { + /** + * Label of the field + */ + label: string; + /** + * Placeholder + */ + placeholder: string; + /** + * Function to be called onChange + */ + onInputChange: (val: string) => void; + /** + * Height of the input box + */ + height: string; + /** + * Width of the input box + */ + width?: string; + minWidth?: any; + maxWidth?: any; + isUpperCase?: boolean; + value?: string; +} + +export const InputField: React.FC = ({ + onInputChange, + placeholder, + label, + height, + width, + value, + ...props +}) => { + const theme = useTheme(); + const onChangeInput = (val: any) => { + let valueTobeSent = val; + if (props.isUpperCase) { + valueTobeSent = val.toUpperCase(); + } + // setInputValue(valueTobeSent); + onInputChange(valueTobeSent); + }; + + const getBoarderColor = () => { + if (props.error) { + return '#FF6A60'; + } else { + return '#EFF1F7'; + } + }; + const inputLabelStyles = makeStyles({ + root: { + color: `${theme.custom.greyscale.medium}`, + // marginLeft: '0.75rem', + display: 'none', + }, + focused: {}, + shrink: { + transform: 'translate(0, 1.5px) scale(1)', + }, + }); + const inputLabelClasses = inputLabelStyles(); + + const inputBaseStyles = makeStyles({ + root: { + padding: '0px', + margin: '0px', + }, + input: { + padding: '0px 0px 0px 24px', + boxSizing: 'border-box', + margin: '0px', + color: `${theme.custom.black}`, + fontSize: 16, + fontWeight: 400, + '&::placeholder': { + textOverflow: 'ellipsis !important', + color: `#7483AB`, + marginLeft: '24px', + }, + backgroundColor: theme.custom.white, + border: `2px solid ${getBoarderColor()}`, + borderRadius: '8px', + height: height || '46px', + width: width || '100%', + minWidth: props.minWidth || 0, + maxWidth: props.maxWidth || '100%', + }, + formControl: { + 'label + &': { + padding: '13px 16px', + margin: '0px', + }, + }, + }); + const inputBaseClasses = inputBaseStyles(); + + const helperTextStyles = makeStyles({ + root: { + // marginTop: -10, + marginLeft: 10, + }, + error: { + '&.MuiFormHelperText-root.Mui-error': { + color: '#FF6A60', + }, + }, + }); + const helperTextClasses = helperTextStyles(); + + return ( + onChangeInput(e.target.value)} + value={value} + error={props.error} + {...props} + /> + ); +}; diff --git a/packages/govern-console/src/components/Labels/Label.tsx b/packages/govern-console/src/components/Labels/Label.tsx new file mode 100644 index 000000000..3ed303211 --- /dev/null +++ b/packages/govern-console/src/components/Labels/Label.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { styled, Theme } from '@material-ui/core/styles'; +import MUIChip, { ChipProps } from '@material-ui/core/Chip'; + +export interface LabelProps extends ChipProps { + /** + * Label Color + */ + labelColor: string; + /** + * Label Text + */ + labelText: string | React.ReactNode; +} + +const getBackground = (labelColor: string, theme: Theme) => { + if (labelColor === 'green') return `${theme.custom.labels.green}`; + if (labelColor === 'orange') return `${theme.custom.labels.orange}`; + if (labelColor === 'purple') return `${theme.custom.labels.purple}`; + if (labelColor === 'red') return `${theme.custom.labels.red}`; + if (labelColor === 'lightBlue') return `${theme.custom.labels.lightBlue}`; + if (labelColor === 'grey') return `${theme.custom.labels.grey}`; +}; + +const getColor = (labelColor: string, theme: Theme) => { + if (labelColor === 'green') return `${theme.custom.white}`; + if (labelColor === 'orange') return `${theme.custom.white}`; + if (labelColor === 'yellow') return `${theme.custom.white}`; + if (labelColor === 'red') return `${theme.custom.white}`; + if (labelColor === 'white') return `${theme.custom.black}`; + if (labelColor === 'grey') return `${theme.custom.white}`; + + return `${theme.custom.white}`; +}; +const getBorder = (labelColor: string, theme: Theme): string => { + if (labelColor === 'white') { + return `2px solid ${theme.custom.greyscale.soft}`; + } else { + return 'none'; + } +}; +const StyledLabel = styled(MUIChip)( + ({ labelColor, theme }: { labelColor: string; theme: Theme }) => ({ + color: getColor(labelColor, theme), + background: getBackground(labelColor, theme), + width: 'fit-content', + height: '19px', + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + padding: '1px 3px', + borderRadius: '40px', + border: getBorder(labelColor, theme), + '& .MuiChip-label': { + lineHeight: '10px', + fontSize: '12px', + fontWeight: 500, + fontFamily: 'Manrope', + fontStyle: 'normal', + overflow: 'visible', + }, + }), +); + +export const Label: React.FC = ({ labelColor, labelText }) => { + return ; +}; diff --git a/packages/govern-console/src/components/Modal/SimpleModal.tsx b/packages/govern-console/src/components/Modal/SimpleModal.tsx new file mode 100644 index 000000000..3d9fd4b84 --- /dev/null +++ b/packages/govern-console/src/components/Modal/SimpleModal.tsx @@ -0,0 +1,63 @@ +import Modal, { ModalProps } from '@material-ui/core/Modal'; +import { useTheme, styled } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; +import { ANWrappedPaper } from '../WrapperPaper/ANWrapperPaper'; +import CloseIcon from '@material-ui/icons/Close'; +import IconButton from '@material-ui/core/IconButton'; + +export interface SimpleModalProps extends ModalProps { + /** + * Title text of the modal + */ + modalTitle?: string; +} + +const NakedModal = styled(Modal)({ + height: '100%', + justifyContent: 'center', + display: 'flex', + alignItems: 'center', +}); + +const Title = styled(Typography)({ + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 500, + fontSize: 28, + lineHeight: '38px', + color: '#20232C', + marginTop: 17, + height: 50, + display: 'flex', + justifyContent: 'start', +}); + +const ModalCloseButton = styled('div')({ + height: 18, + width: 18, + cursor: 'pointer', + position: 'relative', + left: '90%', + marginBottom: '-10px', +}); + +export const SimpleModal: React.FC = (props: SimpleModalProps) => { + return ( + + + + { + typeof props.onClose !== 'undefined' ? props.onClose({}, 'backdropClick') : null; + }} + > + + + + {props.modalTitle} + {props.children} + + + ); +}; diff --git a/packages/govern-console/src/components/Modal/TransactionsModal.tsx b/packages/govern-console/src/components/Modal/TransactionsModal.tsx new file mode 100644 index 000000000..d8676c3f0 --- /dev/null +++ b/packages/govern-console/src/components/Modal/TransactionsModal.tsx @@ -0,0 +1,47 @@ +import React, { useContext, useCallback } from 'react'; +import Dialog from '@material-ui/core/Dialog'; +import TransactionKeeper from 'components/TransactionKeeper/TransactionKeeper'; +import { ModalsContext, closeTransactionsModalAction } from 'containers/HomePage/ModalsContext'; + +const TransactionsModal: React.FC = () => { + const { + state: { + transactionsModal: { + open, + params: { + onTransactionSuccess, + transactionList, + onTransactionFailure, + onCompleteAllTransactions, + }, + }, + }, + dispatch, + } = useContext(ModalsContext); + + const handleClose = useCallback(() => { + dispatch(closeTransactionsModalAction); + }, [dispatch]); + + return ( + <> + + + + + ); +}; + +export default TransactionsModal; diff --git a/packages/govern-console/src/components/NewAction/NewAction.tsx b/packages/govern-console/src/components/NewAction/NewAction.tsx deleted file mode 100644 index ec1f9b421..000000000 --- a/packages/govern-console/src/components/NewAction/NewAction.tsx +++ /dev/null @@ -1,382 +0,0 @@ -import React, { useCallback, useState } from 'react' -import BN from 'bn.js' -import { useWallet } from 'use-wallet' -import abiCoder from 'web3-eth-abi' -import { toHex } from 'web3-utils' -import 'styled-components/macro' -import Button from '../Button' -import Frame from '../Frame/Frame' -import { useContract } from '../../lib/web3-contracts' -import ercAbi from '../../lib/abi/erc20.json' -import queueAbi from '../../lib/abi/GovernQueue.json' - -const EMPTY_BYTES = '0x00' -const EMPTY_FAILURE_MAP = - '0x0000000000000000000000000000000000000000000000000000000000000000' -const NO_TOKEN = `${'0x'.padEnd(42, '0')}` - -type Input = { - name: string | undefined - type: string | undefined -} - -type AbiType = { - inputs: Input - payable: string - stateMutability: string - type: string -} - -type NewActionProps = { - config: any - executorAddress: string - queueAddress: string -} - -export default function NewAction({ - config, - executorAddress, - queueAddress, -}: NewActionProps): JSX.Element { - const [abi, setAbi] = useState('') - const [contractAddress, setContractAddress] = useState('') - const [parsedAbi, setParsedAbi] = useState([]) - const [proof, setProof] = useState('') - const [executionResult, setExecutionResult] = useState('') - const [type, setType] = useState('') - - const queueContract = useContract(queueAddress, queueAbi) - const ercContract = useContract(config.scheduleDeposit.token, ercAbi) - - const handleParseAbi = useCallback( - e => { - e.preventDefault() - try { - const parsedAbi = JSON.parse(abi) - setParsedAbi(parsedAbi) - } catch (err) { - console.error('there seems to be an error in the ABI.') - } - }, - [abi], - ) - - const handleSetExecutionResult = useCallback( - (result, message) => { - if (result === 'confirmed') { - setType('green') - setExecutionResult(message) - } - if (result === 'info') { - setType('cyan') - setExecutionResult(message) - } - if (result === 'error') { - setType('red') - setExecutionResult(message) - } - }, - [setExecutionResult], - ) - - return ( - <> -

- New action -

- - {executionResult && ( -
- {executionResult} -
- )} -
- - - - -
- {abi && - parsedAbi.map( - (abiItem: any) => - abiItem?.type === 'function' && ( - - - - ), - )} - - - ) -} - -type ContractCallHandlerProps = { - contractAddress: string - config: any - ercContract: any - executor: string - handleSetExecutionResult: (result: string, v: string) => void - inputs: Input[] | any[] - name: string - proof: string - queueAddress: string - queueContract: any - rawAbiItem: AbiType -} - -function ContractCallHandler({ - config, - contractAddress, - ercContract, - executor, - handleSetExecutionResult, - inputs, - name, - proof, - queueAddress, - queueContract, - rawAbiItem, -}: ContractCallHandlerProps) { - const [result, setResult] = useState('') - const [values, setValues] = useState(() => { - if (inputs.length === 0) { - return null - } - // @ts-ignore - // Sorry but I got very tired of fighting with types - return inputs.map((input: any) => ({ - name: input.name, - type: input.type, - value: '', - })) - }) - - const { account } = useWallet() - - const updateValue = useCallback( - (name, updatedValue) => { - if (values) { - setValues((elements: any) => - elements.map((element: any) => - element.name === name - ? { ...element, value: updatedValue } - : element, - ), - ) - } - }, - [values], - ) - - const handleExecute = useCallback( - async e => { - e.preventDefault() - try { - // First, let's handle token approvals. - // There are 3 cases to check - // 1. The user has more allowance than needed, we can skip. (0 tx) - // 2. The user has less allowance than needed, and we need to raise it. (2 tx) - // 3. The user has 0 allowance, we just need to approve the needed amount. (1 tx) - const allowance = await ercContract.allowance(account, queueAddress) - if ( - allowance.lt(config.scheduleDeposit.amount) && - config.scheduleDeposit.token !== NO_TOKEN - ) { - if (!allowance.isZero()) { - const resetTx = await ercContract.approve(account, '0') - await resetTx.wait(1) - } - await ercContract.approve(queueAddress, config.scheduleDeposit.amount) - } - const functionValues = values ? values.map((val: any) => val.value) : [] - - // @ts-ignore - const encodedFunctionCall = abiCoder.encodeFunctionCall( - rawAbiItem, - functionValues, - ) - - const nonce = await queueContract.nonce() - const bnNonce = new BN(nonce.toString()) - const newNonce = bnNonce.add(new BN('1')) - - // Current time + 30 secs buffer. - // This is necessary for DAOs with lower execution delays, in which - // the tx getting picked up by a later block can make the tx fail. - const currentDate = - Math.ceil(Date.now() / 1000) + Number(config.executionDelay) + 60 - const container = { - payload: { - nonce: newNonce.toString(), - executionTime: currentDate, - submitter: account, - executor, - actions: [ - { - to: contractAddress, - value: EMPTY_BYTES, - data: encodedFunctionCall, - }, - ], - allowFailuresMap: EMPTY_FAILURE_MAP, - proof: proof ? toHex(proof) : EMPTY_BYTES, - }, - config: { - executionDelay: config.executionDelay, - scheduleDeposit: { - token: config.scheduleDeposit.token, - amount: config.scheduleDeposit.amount, - }, - challengeDeposit: { - token: config.challengeDeposit.token, - amount: config.challengeDeposit.amount, - }, - resolver: config.resolver, - rules: config.rules, - }, - } - - const tx = await queueContract.schedule(container, { - gasLimit: 500000, - }) - - handleSetExecutionResult('info', `Sending transaction.`) - await tx.wait(1) - - setResult(tx.hash) - handleSetExecutionResult( - 'confirmed', - `Transaction sent successfully. hash: ${tx.hash}`, - ) - } catch (e) { - console.error(e) - handleSetExecutionResult( - 'error', - `There was an error with the transaction.`, - ) - } - }, - [ - account, - config, - contractAddress, - ercContract, - executor, - handleSetExecutionResult, - proof, - queueAddress, - queueContract, - rawAbiItem, - values, - ], - ) - - return ( - <> -

{name}

-
- {values?.map((value: any, i: number) => ( -
- -
- ))} - - Result: {result} -
- - ) -} diff --git a/packages/govern-console/src/components/PageContent/PageContent.tsx b/packages/govern-console/src/components/PageContent/PageContent.tsx new file mode 100644 index 000000000..103ee5b71 --- /dev/null +++ b/packages/govern-console/src/components/PageContent/PageContent.tsx @@ -0,0 +1,38 @@ +import React, { memo, ReactNode } from 'react'; +import { Grid, GridItem, useLayout, Accordion } from '@aragon/ui'; +import { HelpText, PageName } from 'utils/HelpText'; +import HelpComponent from 'components/HelpComponent/HelpComponent'; + +type PageContentProps = { + children: ReactNode; + pageName?: PageName; + card?: ReactNode; +}; + +const PageContent: React.FC = ({ pageName, children, card }) => { + const { layoutName } = useLayout(); + + const sideTopComponent = card || (pageName && ); + + return ( + + + {children} + + + {sideTopComponent} + + + + + + ); +}; + +export default memo(PageContent); diff --git a/packages/govern-console/src/components/ProgressBars/BlueProgressBar.tsx b/packages/govern-console/src/components/ProgressBars/BlueProgressBar.tsx new file mode 100644 index 000000000..5cd6f44eb --- /dev/null +++ b/packages/govern-console/src/components/ProgressBars/BlueProgressBar.tsx @@ -0,0 +1,33 @@ +import LinearProgress, { LinearProgressProps } from '@material-ui/core/LinearProgress'; +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles({ + determinate: { + flexGrow: 1, + width: '100%', + height: '11px', + borderRadius: '10px', + backgroundColor: '#ECFAFF', + }, + barColorPrimary: { + width: '100%', + height: '11px', + borderRadius: '50px', + background: 'linear-gradient(107.79deg, #01B9F2 1.46%, #01DBE9 100%)', + }, +}); + +export const BlueProgressBar = (props: LinearProgressProps) => { + const classes = useStyles(); + + return ( + + ); +}; diff --git a/packages/govern-console/src/components/ProposalCards/ProposalCard.tsx b/packages/govern-console/src/components/ProposalCards/ProposalCard.tsx new file mode 100644 index 000000000..9da7c3ed0 --- /dev/null +++ b/packages/govern-console/src/components/ProposalCards/ProposalCard.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { Label } from '../Labels/Label'; +import { Box, StyledText, useTheme, GU } from '@aragon/ui'; + +export interface ProposalCardProps { + /** + * TransactionHash of the proposal + */ + transactionHash: string; + /** + * Title of the proposal + */ + proposalTitle: string; + /** + * Date of proposal + */ + proposalDate: string | React.ReactNode; + /** + * Status of the proposal + */ + proposalStatus: string; + /** + * Status of the proposal + */ + proposalStatusColor: string; + /** + * Optional Function Handler + */ + onClickProposalCard?: () => void; +} + +export const ProposalCard: React.FC = ({ + transactionHash, + proposalTitle, + proposalDate, + proposalStatus, + proposalStatusColor, + onClickProposalCard, +}) => { + const theme = useTheme(); + + const getSlicedTransactionHash = () => { + const hash = + transactionHash.substring(0, 6) + + '...' + + transactionHash.substring(transactionHash.length - 5); + return hash; + }; + + return ( + + + ); +}; diff --git a/packages/govern-console/src/components/PropsalOptions/ProposalOptions.tsx b/packages/govern-console/src/components/PropsalOptions/ProposalOptions.tsx new file mode 100644 index 000000000..90f3df992 --- /dev/null +++ b/packages/govern-console/src/components/PropsalOptions/ProposalOptions.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { styled, useTheme } from '@material-ui/core/styles'; +import { ANButton } from '../Button/ANButton'; +import TextField from '@material-ui/core/TextField'; +import removeOptionIcon from '../../images/ds/remove-option.svg'; +export interface ProposalOptionsProps { + /** + * Current set of Options + */ + options: Array; + /** + * Callback to Add Option + */ + onAddOption: any; + /** + * Callback to delete an option + */ + onDeleteOption: any; + /** + * Callback to update the current selected option + */ + onUpdateOption: any; + /** + * width of the widget + */ + width: string; + /** + * height of the widget + */ + height: string; +} + +const StyledTextField = styled(TextField)( + ({ width, height }: { width: string; height: string }) => ({ + background: '#FFFFFF', + border: '1px solid #D9E0F5', + boxSizing: 'border-box', + borderRadius: 8, + textAlign: 'center', + width: width || 396, + height: height || 46, + display: 'block', + marginBottom: 12, + paddingLeft: 18, + paddingRight: 18, + '& .MuiInput-root': { + width: '100%', + height: '100%', + }, + '& .MuiInputBase-input': { + textAlign: 'center', + width: '100%', + }, + '& .MuiInput-underline:hover:not(.Mui-disabled):before': { + borderBottom: 'none', + }, + '& .MuiInput-underline': { + '&::before': { + borderBottom: 'none', + }, + '&::after': { + borderBottom: 'none', + }, + }, + }), +); + +/** + * Primary UI component for user interaction + */ +const ProposalOptions: React.FC = ({ + options, + onAddOption, + onDeleteOption, + onUpdateOption, + width, + height, + ...props +}) => { + // const [val, setVal] = React.useState('0'); + + return ( + <> + {options.map((option, index) => { + return ( + { + onUpdateOption(e.target.value, index); + }} + width={width} + height={height} + InputProps={{ + startAdornment: index, + endAdornment: + options.length > 1 ? ( + onDeleteOption(index)} + /> + ) : null, + }} + /> + ); + })} + + + ); +}; + +export default ProposalOptions; diff --git a/packages/govern-console/src/components/Stepper/Stepper.tsx b/packages/govern-console/src/components/Stepper/Stepper.tsx new file mode 100644 index 000000000..9267c8fd9 --- /dev/null +++ b/packages/govern-console/src/components/Stepper/Stepper.tsx @@ -0,0 +1,120 @@ +import React, { useState, useCallback } from 'react'; +import { + GU, + RADII, + useLayout, + useTheme, + ButtonIcon, + IconPlus, + IconMinus, + textStyle, +} from '@aragon/ui'; + +const adornmentPadding = 1 * GU; +const adornmentWidth = 40; + +type StepperProps = { + defaultValue?: number; + onChange: (value: number) => void; + min?: number; + max?: number; + value?: number; +}; + +const isDisableMin = (value: number, min: number) => value <= min; +const isDisabledMax = (value: number, max?: number) => max && value >= max; + +export const Stepper: React.FC = ({ + defaultValue, + value, + onChange, + min = 0, + max, +}) => { + const theme = useTheme(); + const { layoutName } = useLayout(); + + const [internalValue, setInternalValue] = useState(() => { + let newValue = value || defaultValue || min; + if (newValue < min) { + newValue = min; + } + return newValue; + }); + + const updateCount = useCallback( + (type: 'up' | 'down') => { + const newValue = type === 'up' ? internalValue + 1 : internalValue - 1; + setInternalValue(newValue); + onChange(newValue); + }, + [internalValue, setInternalValue, onChange], + ); + + return ( +
div { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + } + `} + > +
+ updateCount('down')} + > + + +
+
+ {value} +
+
+ updateCount('up')} + > + + +
+
+ ); +}; diff --git a/packages/govern-console/src/components/Switchs/BlueSwitch.tsx b/packages/govern-console/src/components/Switchs/BlueSwitch.tsx new file mode 100644 index 000000000..d02bea642 --- /dev/null +++ b/packages/govern-console/src/components/Switchs/BlueSwitch.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Switch, { SwitchProps } from '@material-ui/core/Switch'; + +/** + * UI Switch component for user interaction + */ + +const useStyles = makeStyles({ + root: { + width: 'auto', + height: '50px', + }, + track: { + width: '46px', + height: '22px', + borderRadius: '32px', + '$checked$checked + &': { + opacity: 0.7, + backgroundColor: '#FFFFFF', + }, + }, + switchBase: { + '&$checked': { + color: '#01B9F2', + transform: 'translateX(24px)', + }, + '& + $track': { + backgroundColor: '#FFFFFF', + opacity: 0.7, + borderColor: '#EFF1F7', + border: '2px solid', + boxShadow: 'inset 2px 2px 2px rgba(116, 131, 178, 0.25)', + }, + }, + checked: {}, + thumb: { + color: '#01B9F2', + marginTop: '6px', + marginLeft: '6px', + transform: 'translateX(0px)', + background: 'linear-gradient(107.79deg, #01B9F2 1.46%, #01DBE9 100%)', + }, +}); + +export const BlueSwitch: React.FC = ({ ...props }) => { + const classes = useStyles(); + + return ( + + ); +}; diff --git a/packages/govern-console/src/components/TextArea/TextArea.tsx b/packages/govern-console/src/components/TextArea/TextArea.tsx new file mode 100644 index 000000000..dcef13120 --- /dev/null +++ b/packages/govern-console/src/components/TextArea/TextArea.tsx @@ -0,0 +1,12 @@ +import React, { memo, useState } from 'react'; +import TextField, { TextFieldProps } from '@material-ui/core/TextField'; + +const TextArea: React.FC = ({ ...props }) => { + return ( + <> + + + ); +}; + +export default memo(TextArea); diff --git a/packages/govern-console/src/components/Titles/styles.tsx b/packages/govern-console/src/components/Titles/styles.tsx new file mode 100644 index 000000000..c0e79ba8e --- /dev/null +++ b/packages/govern-console/src/components/Titles/styles.tsx @@ -0,0 +1,32 @@ +import { styled } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; + +export const InputTitle = styled(Typography)({ + width: 'fit-content', + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + fontSize: 28, + lineHeight: '25px', + color: '#20232C', + marginTop: '17px', +}); + +export const InputSubTitle = styled(Typography)({ + width: 'fit-content', + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + fontSize: 18, + lineHeight: '25px', + color: '#7483AB', + marginTop: '17px', + marginBottom: '17px', +}); + +export const OptionTextStyle = styled('div')({ + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 400, + fontSize: 18, +}); diff --git a/packages/govern-console/src/components/TransactionKeeper/TransactionKeeper.tsx b/packages/govern-console/src/components/TransactionKeeper/TransactionKeeper.tsx new file mode 100644 index 000000000..10b1e764b --- /dev/null +++ b/packages/govern-console/src/components/TransactionKeeper/TransactionKeeper.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import { CustomTransaction, CustomTransactionStatus } from 'utils/types'; +import produce from 'immer'; +import TransactionDialog from 'components/Dialog/TransactionDialog'; +import FailureDialog from 'components/Dialog/FailureDialog'; +import { getErrorFromException } from 'utils/HelperFunctions'; + +enum TransactionKeeperState { + Initial, + Processing, + Success, + Failure, +} + +export interface TransactionKeeperProps { + transactionList: CustomTransaction[]; + onTransactionFailure?: (errorMessage: string, transaction: CustomTransaction) => void; + onTransactionSuccess?: (updatedTransaction: CustomTransaction, transactionReceipt: any) => void; + onCompleteAllTransactions?: (transactions: CustomTransaction[]) => void; + closeModal: () => void; +} + +const TransactionKeeper: React.FC = ({ + transactionList, + onTransactionFailure, + onTransactionSuccess, + onCompleteAllTransactions, + closeModal, +}) => { + const [state, setState] = React.useState(TransactionKeeperState.Initial); + const [transactions, updateTransactions] = React.useState([ + ...transactionList, + ]); + const [errorMessage, setErrorMessage] = React.useState(''); + + const updateTransactionStatus = React.useCallback( + (txIndex: number, newStatus: CustomTransactionStatus) => { + const txs = [...transactions]; + txs[txIndex].status = newStatus; + updateTransactions(txs); + }, + [transactions], + ); + + const executeTransactions = React.useCallback(async () => { + setState(TransactionKeeperState.Processing); + let index = 0; + let isQueueAborted = false; + for (const transaction of transactions) { + if (isQueueAborted) return; + try { + updateTransactionStatus(index, CustomTransactionStatus.InProgress); + const transactionResponse: any = await transaction.tx(); + const transactionReceipt = await transactionResponse.wait(); + updateTransactionStatus(index, CustomTransactionStatus.Successful); + if (typeof onTransactionSuccess === 'function') { + onTransactionSuccess(transactions[index], transactionReceipt); + } + } catch (ex) { + const updatedTransaction = produce(transaction, (draft) => { + draft.status = CustomTransactionStatus.Failed; + }); + // TODO add a condition to check if we need to stop executing transactions based on a transaction level propoerty. + // This propeorty if needed is to be added to CustomTransactions type. CustomTransaction.abortQueueOnFailure = true/false + isQueueAborted = true; + updateTransactionStatus(index, CustomTransactionStatus.Failed); + setState(TransactionKeeperState.Failure); + const message = getErrorFromException(ex); + if (typeof onTransactionFailure === 'function') { + onTransactionFailure(message, updatedTransaction); + } + setErrorMessage(ex.message); + } + index++; + } + if (!isQueueAborted) { + setState(TransactionKeeperState.Success); + } + }, [transactions, onTransactionFailure, onTransactionSuccess, updateTransactionStatus]); + + switch (state) { + case TransactionKeeperState.Initial: { + return ( + 1 ? 'Confirm transactions' : 'Confirm Transaction'} + transactions={transactions} + onClick={executeTransactions} + onClose={closeModal} + buttonLabel={'Get started'} + /> + ); + } + case TransactionKeeperState.Processing: { + return ( + 1 ? 'Processing transactions' : 'Processing transaction'} + info={'Please do not close this window until it finishes.'} + transactions={transactions} + /> + ); + } + case TransactionKeeperState.Success: { + return ( + 1 ? 'Completed Transactions' : 'Completed Transaction'} + transactions={transactions} + buttonLabel={'Continue'} + onClick={() => { + closeModal(); + if (typeof onCompleteAllTransactions === 'function') { + onCompleteAllTransactions(transactions); + } + }} + /> + ); + } + case TransactionKeeperState.Failure: { + return ( + + ); + } + } +}; + +export default React.memo(TransactionKeeper); diff --git a/packages/govern-console/src/components/ViewAction/ViewAction.tsx b/packages/govern-console/src/components/ViewAction/ViewAction.tsx deleted file mode 100644 index 4bdfdf967..000000000 --- a/packages/govern-console/src/components/ViewAction/ViewAction.tsx +++ /dev/null @@ -1,471 +0,0 @@ -import React, { useMemo, useCallback, useState } from 'react' -import { useParams } from 'react-router-dom' -import * as clipboard from 'clipboard-polyfill' -import { fromUnixTime } from 'date-fns' -import { toHex } from 'web3-utils' -import 'styled-components/macro' -import Button from '../Button' -import Entity from '../Entity/Entity' -import Frame from '../Frame/Frame' -import Info from '../Info/Info' -import { useContract } from '../../lib/web3-contracts' -import { shortenAddress, ETH_EMPTY_HEX } from '../../lib/web3-utils' -import queueAbi from '../../lib/abi/GovernQueue.json' -import { usePermissions } from '../../Providers/Permissions' -import { useWallet } from '../../Providers/Wallet' - -const EMPTY_FAILURE_MAP = - '0x0000000000000000000000000000000000000000000000000000000000000000' - -type Collateral = { - token: string - amount: string -} - -type Config = { - executionDelay: string - scheduleDeposit: Collateral - challengeDeposit: Collateral - resolver: string - rules: string -} - -type Action = { - id: string - to: string - value: string - data: string -} - -type Payload = { - id: string - nonce: string - executionTime: string - submitter: string - executor: any - actions: Action[] - proof: string -} - -type ContainerEventChallenge = { - id: string - container: any - createdAt: string - actor: string - collateral: Collateral - disputeId: string - reason: string - resolver: string -} - -type ContainerEventExecute = { - id: string - container: any - createdAt: string - execResults: string[] -} - -type ContainerEventResolve = { - id: string - container: any - createdAt: string - approved: boolean -} - -type ContainerEventRule = { - id: string - container: any - createdAt: string - ruling: string -} - -type ContainerEventSchedule = { - id: string - container: any - createdAt: string - collateral: Collateral -} - -type ContainerEventSubmitEvidence = { - id: string - container: any - createdAt: string - evidence: string - submitter: string - finished: boolean -} - -type ContainerEventVeto = { - id: string - container: any - created: string - reason: string -} - -type ContainerEvent = - | ContainerEventChallenge - | ContainerEventExecute - | ContainerEventResolve - | ContainerEventRule - | ContainerEventSchedule - | ContainerEventSubmitEvidence - | ContainerEventVeto - -type Container = { - id: string - queue: string - state: string - config: Config - payload: Payload - history: ContainerEvent[] -} - -type ViewActionWrapperProps = { - containers: Container[] - queueAddress: string -} - -type ViewActionProps = { - container: Container - queueAddress: string -} - -function ViewAction({ container, queueAddress }: ViewActionProps) { - const [executionStatus, setExecutionStatus] = useState('') - const [justification, setJustification] = useState('') - const [statusType, setStatusType] = useState< - 'error' | 'info' | 'success' | '' - >('') - const { wallet } = useWallet() - const { status: accountStatus } = wallet - const queueContract = useContract(queueAddress, queueAbi) - const { permissions } = usePermissions() - const { veto: canVeto, challenge: canChallenge } = permissions - - const handleSetExecutionStatus = useCallback( - (result, message) => { - setStatusType(result) - setExecutionStatus(message) - }, - [setExecutionStatus, setStatusType], - ) - - const execute = useCallback(async () => { - if (accountStatus !== 'connected') { - alert('Executing actions requires a signer. Please connect your account.') - return - } - if (!queueContract) { - alert('The queue contract hasn’t loaded. Please retry.') - return - } - const payloadActions = container.payload.actions.map((action: Action) => ({ - to: action.to, - value: action.value, - data: action.data, - })) - const craftedContainer = { - payload: { - nonce: container.payload.nonce, - executionTime: container.payload.executionTime, - submitter: container.payload.submitter, - executor: container.payload.executor.address, - actions: payloadActions, - allowFailuresMap: EMPTY_FAILURE_MAP, - proof: container.payload.proof, - }, - config: { - executionDelay: container.config.executionDelay, - scheduleDeposit: { - token: container.config.scheduleDeposit.token, - amount: container.config.scheduleDeposit.amount, - }, - challengeDeposit: { - token: container.config.challengeDeposit.token, - amount: container.config.challengeDeposit.amount, - }, - resolver: container.config.resolver, - rules: container.config.rules, - }, - } - - try { - const tx = await queueContract.execute(craftedContainer, { - gasLimit: 500000, - }) - handleSetExecutionStatus('info', `Sending transaction.`) - await tx.wait(1) - handleSetExecutionStatus( - 'success', - `Transaction sent successfully. hash: ${tx.hash}`, - ) - } catch (err) { - console.log(err) - handleSetExecutionStatus( - 'error', - `There was an error with the transaction.`, - ) - } - }, [accountStatus, container, handleSetExecutionStatus, queueContract]) - - const veto = useCallback(async () => { - if (accountStatus !== 'connected') { - alert('Executing actions requires a signer. Please connect your account.') - return - } - if (!queueContract) { - alert('The queue contract hasn’t loaded. Please retry.') - return - } - try { - const containerHash = container.id - const tx = await queueContract.veto( - containerHash, - justification ? toHex(justification) : '0x00', - { gasLimit: 500000 }, - ) - handleSetExecutionStatus('info', `Sending transaction.`) - await tx.wait(1) - handleSetExecutionStatus( - 'success', - `Transaction sent successfully. hash: ${tx.hash}`, - ) - } catch (err) { - console.log(err) - handleSetExecutionStatus( - 'error', - `There was an error with the transaction.`, - ) - } - }, [ - accountStatus, - container, - handleSetExecutionStatus, - queueContract, - justification, - ]) - - const challenge = useCallback(async () => { - if (accountStatus !== 'connected') { - alert('Executing actions requires a signer. Please connect your account.') - return - } - if (!queueContract) { - alert('The queue contract hasn’t loaded. Please retry.') - return - } - const payloadActions = container.payload.actions.map((action: Action) => ({ - to: action.to, - value: action.value, - data: action.data, - })) - // TODO: handle token approvals first - const craftedContainer = { - payload: { - nonce: container.payload.nonce, - executionTime: container.payload.executionTime, - submitter: container.payload.submitter, - executor: container.payload.executor.address, - actions: payloadActions, - allowFailuresMap: EMPTY_FAILURE_MAP, - proof: container.payload.proof, - }, - config: { - executionDelay: container.config.executionDelay, - scheduleDeposit: { - token: container.config.scheduleDeposit.token, - amount: container.config.scheduleDeposit.amount, - }, - challengeDeposit: { - token: container.config.challengeDeposit.token, - amount: container.config.challengeDeposit.amount, - }, - resolver: container.config.resolver, - rules: container.config.rules, - }, - } - try { - const tx = await queueContract.challenge(craftedContainer, '0x00', { - gasLimit: 500000, - }) - handleSetExecutionStatus('info', `Sending transaction.`) - await tx.wait(1) - handleSetExecutionStatus( - 'success', - `Transaction sent successfully. hash: ${tx.hash}`, - ) - } catch (err) { - console.log(err) - handleSetExecutionStatus( - 'error', - `There was an error with the transaction.`, - ) - } - }, [accountStatus, container, handleSetExecutionStatus, queueContract]) - - const vetoEvent = container.history.find( - (event: any) => event.__typename === 'ContainerEventVeto', - ) - // @ts-ignore - const reason = vetoEvent?.reason ?? '' - - return ( - <> - -

Action {shortenAddress(container.id)}

-

Status

-

{container.state}

- {container.state === 'Cancelled' && ( - <> -

Reason

- - - )} - {executionStatus && {executionStatus}} - - - {container.state !== 'Executed' && container.state !== 'Cancelled' && ( - -
- -
-

Available actions

- {container.state === 'Scheduled' && ( - - )} - {canVeto && ( - - )} - {canChallenge && ( - - )} - - )} - -

Action Payload

-

Container hash

-

clipboard.writeText(container.id)}>{container.id}

-

Nonce

-

{container.payload.nonce}

-

Execution time

-

- {fromUnixTime(Number(container.payload.executionTime)).toUTCString()} -

-

Submitter

-

- -

-

Proof (Justification)

-

- -

-

On-chain actions

-

-

    - {container.payload.actions.map((action: Action) => ( - -
  • - to: -
  • -
  • value: {action.value}
  • -
  • data: {action.data}
  • -
    - ))} -
-

- - - -

Action Configuration

-

Execution Delay

-

{container.config.executionDelay}

-

Schedule collateral

-

- Token:{' '} - -

-

Amount: {container.config.scheduleDeposit.amount}

-

Challenge collateral

-

- Token:{' '} - {' '} -

-

Amount: {container.config.challengeDeposit.amount}

-

Resolver

-

- -

-

Rules

-

- {container.config.rules === ETH_EMPTY_HEX ? ( - 'No agreement attached.' - ) : ( - - )} -

- - - ) -} - -export default function ViewActionWrapper({ - containers, - queueAddress, -}: ViewActionWrapperProps): JSX.Element { - const { containerId }: any = useParams() - const container = useMemo(() => { - return containers.find(container => container.id === containerId) - }, [containerId, containers]) - - if (!container) { - return Container not found. - } - - return -} diff --git a/packages/govern-console/src/components/ViewDao/ViewDao.tsx b/packages/govern-console/src/components/ViewDao/ViewDao.tsx deleted file mode 100644 index 8603620e7..000000000 --- a/packages/govern-console/src/components/ViewDao/ViewDao.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { useHistory, useParams } from 'react-router-dom' -import TokenAmount from 'token-amount' -import 'styled-components/macro' -import Button from '../Button' -import Entity from '../Entity/Entity' -import FilteredActions from '../FilteredActions/FilteredActions' -import Frame from '../Frame/Frame' -import { usePermissions } from '../../Providers/Permissions' -import { useWalletAugmented } from '../../Providers/Wallet' -import { KNOWN_GOVERN_ROLES, KNOWN_QUEUE_ROLES } from '../../lib/known-roles' -import { ETH_ANY_ADDRESS, ETH_EMPTY_HEX } from '../../lib/web3-utils' - -const ACTIONS_PER_PAGE = 8 - -type ViewDaoProps = { - dao: any -} - -export default function ViewDao({ dao }: ViewDaoProps): JSX.Element { - const [ethBalance, setEthBalance] = useState('') - const { daoAddress }: any = useParams() - const history = useHistory() - const { ethers } = useWalletAugmented() - const { permissions, populatePermissions } = usePermissions() - const { schedule: canSchedule } = permissions - - useEffect(() => { - async function fetchEthBalance() { - const balance = await ethers.getBalance(dao.executor.address) - setEthBalance(balance.toString()) - } - fetchEthBalance() - }, [dao, ethers]) - - useEffect(() => { - populatePermissions(dao.queue.roles) - }, [dao, populatePermissions]) - - const handleNewAction = useCallback(() => { - history.push(`/${daoAddress}/new-action`) - }, [history, daoAddress]) - - return ( - <> -

- {daoAddress} Overview -

- -

ETH balance

-

- {' '} - {TokenAmount.format(ethBalance, 18, { - symbol: 'Ξ', - })}{' '} -

- - -

Govern Executor

-

Address

-

- -

-

Govern Queue

-

Address

-

- -

-

Config

-

Execution delay: {dao.queue.config.executionDelay}

-

Schedule collateral:

-
    -
  • - Token: - -
  • -
  • Amount: {dao.queue.config.scheduleDeposit.amount}
  • -
-

Challenge collateral:

-
    -
  • - Token: - -
  • -
  • Amount: {dao.queue.config.challengeDeposit.amount}
  • -
-

Rules

-

- {dao.queue.config.rules === ETH_EMPTY_HEX ? ( - 'No agreement attached.' - ) : ( - - )} -

- - -
-

Actions

-
- {canSchedule && ( - - )} -
-
- - - -

Permissions for Govern

- - - - - - - - - {dao.executor.roles.map((role: any, idx: number) => { - return ( - - - - - ) - })} - -
Role (function)Assigned to entity
- {KNOWN_GOVERN_ROLES.get(role.selector)} - {role.selector} - - -
- - -

Permissions for GovernQueue

- - - - - - - - - {dao.queue.roles.map((role: any, idx: number) => { - return ( - - - - - ) - })} - -
Role (function)Assigned to entity
- {KNOWN_QUEUE_ROLES.get(role.selector)} - {role.selector} - - -
- - - ) -} diff --git a/packages/govern-console/src/components/Wallet/Wallet.tsx b/packages/govern-console/src/components/Wallet/Wallet.tsx new file mode 100644 index 000000000..e88616f79 --- /dev/null +++ b/packages/govern-console/src/components/Wallet/Wallet.tsx @@ -0,0 +1,146 @@ +import { useState } from 'react'; +import { useWallet } from 'use-wallet'; +import { useEffect } from 'react'; +import { networkEnvironment } from 'environment'; +import { Button, EthIdenticon, useLayout, IconConnect, useToast } from '@aragon/ui'; +import { getTruncatedAccountAddress } from 'utils/account'; +import { trackEvent, EventType } from 'services/analytics'; +import { useCallback } from 'react'; + +//TODO add the icon for logged in users +declare let window: any; + +const Wallet = ({}) => { + const connetButtonLabel = 'Connect wallet'; + const context: any = useWallet(); + const { layoutName } = useLayout(); + const toast = useToast(); + const { account, chainId, connect, error, reset, status, networkName, connector } = context; + const [networkStatus, setNetworkStatus] = useState(status); + const [userAccount, setUserAccount] = useState(status); + + useEffect(() => { + if (chainId !== networkEnvironment.chainId) { + setNetworkStatus('wrong-network'); + } else if (error) { + if (error.message.includes('Unsupported chain')) { + setNetworkStatus('unsupported'); + } else { + setNetworkStatus('connection-error'); + } + } else if (status === 'connected') { + setNetworkStatus('connected'); + toast('Your wallet is successfully connected.'); + } else { + setNetworkStatus('disconnected'); + } + }, [status, chainId, toast, error]); + + useEffect(() => { + if (status === 'disconnected') { + return; + } + if (error) { + if (error.message.includes('Unsupported chain')) { + toast('Please select the correct chain in your wallet.'); + } else if (error.message.includes('window.ethereum')) { + toast('Please install a wallet.'); + } else { + toast(error.message); + } + } + }, [status, error, toast]); + + const connectWalletAndSetStatus = async (type: string) => { + try { + if (type === 'injected') { + connect('injected'); + } + } catch (error) { + console.log('error', error); + } + }; + + const disconnect = useCallback(() => { + // analytics + trackEvent(EventType.WALLET_DISCONNECTED, { + wallet_address: userAccount, + wallet_provider: connector, // provider name would make more sense + network: networkName, + }); + + reset(); + }, [userAccount, connector, networkName, reset]); + + //TODO: not suitable connectWalletAndSetStatus has to re-thought + /* eslint-disable */ + useEffect(() => { + if (window && window.ethereum) { + connectWalletAndSetStatus('injected'); + } + }, [window]); + /* eslint-disable */ + + useEffect(() => { + if (account) { + setUserAccount(account); + } + }, [account]); + + if (networkStatus === 'connected') { + return ( + + ) : null} + + + ); +}; + +export default memo(ConsoleMainPage); diff --git a/packages/govern-console/src/containers/CreateDao/CreateDao.tsx b/packages/govern-console/src/containers/CreateDao/CreateDao.tsx new file mode 100644 index 000000000..7554eb71f --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDao.tsx @@ -0,0 +1,74 @@ +import React, { useMemo, useState, useEffect } from 'react'; + +import CreateDaoBasicInfo from './CreateDaoBasicInfo'; +import CreateDaoConfig from './CreateDaoConfig'; +import CreateDaoCollateral from './CreateDaoCollateral'; +import CreateDaoReview from './CreateDaoReview'; +import CreateDaoProgress from './CreateDaoProgress'; +import { CreateDaoSteps } from './utils/Shared'; +import { CreateDaoProvider } from './utils/CreateDaoContextProvider'; +import PageContent from 'components/PageContent/PageContent'; +import { PageName } from 'utils/HelpText'; +import ReviewCard from './components/ReviewCard'; +import scrollToTop from 'utils/scrollToId'; + +const CreateDao: React.FC = () => { + const [activeStep, setActiveStep] = useState(CreateDaoSteps.BasicInfo); + + // scroll to top on active form view change + useEffect(() => { + scrollToTop(); + }, [activeStep]); + + const getPageName = () => { + switch (activeStep) { + case CreateDaoSteps.Config: + return PageName.CREATE_DAO_CONFIG; + + case CreateDaoSteps.Collateral: + return PageName.CREATE_DAO_COLLATERAL; + + default: + return PageName.CREATE_DAO; + } + }; + const activeView = useMemo(() => { + switch (activeStep) { + case CreateDaoSteps.BasicInfo: + return ; + + case CreateDaoSteps.Config: + return ; + + case CreateDaoSteps.Collateral: + return ; + + case CreateDaoSteps.Review: + return ; + + case CreateDaoSteps.Progress: + return ; + + default: + return ; + } + }, [activeStep]); + + const getPageContent = (active: CreateDaoSteps) => { + if (active !== CreateDaoSteps.Progress) { + return ( + } + > + {activeView} + + ); + } + return activeView; + }; + + return {getPageContent(activeStep)}; +}; + +export default CreateDao; diff --git a/packages/govern-console/src/containers/CreateDao/CreateDaoBasicInfo.tsx b/packages/govern-console/src/containers/CreateDao/CreateDaoBasicInfo.tsx new file mode 100644 index 000000000..ed22bb8cf --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDaoBasicInfo.tsx @@ -0,0 +1,252 @@ +import React from 'react'; +import { CreateDaoSteps } from './utils/Shared'; +import { useCreateDaoContext, ICreateDaoBasicInfo } from './utils/CreateDaoContextProvider'; +import { useForm, Controller } from 'react-hook-form'; +import { validateToken, validateAmountForDecimals, daoExists } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import { PROXY_CONTRACT_URL } from '../../utils/constants'; +import { + useLayout, + Grid, + GridItem, + TextInput, + ContentSwitcher, + Checkbox, + Box, + Button, + Info, + SPACING, + Link, + StyledText, + useTheme, +} from '@aragon/ui'; +import StepsHeader from './components/StepsHeader'; +import { constants } from 'ethers'; + +const CreateDaoBasicInfo: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const { layoutName } = useLayout(); + const theme = useTheme(); + const spacing = SPACING[layoutName]; + const { basicInfo, setBasicInfo, handleIsExistingToken } = useCreateDaoContext(); + + const context: any = useWallet(); + const { provider } = context; + + const { + daoIdentifier, + isExistingToken, + tokenName, + tokenSymbol, + tokenAddress, + tokenDecimals, + tokenMintAmount, + isProxy, + } = basicInfo; + + const methods = useForm({ defaultValues: { ...basicInfo } }); + const { control, watch, getValues, trigger } = methods; + + const moveToNextStep = async () => { + const validate = await trigger(); + + if (!validate) return; + + const basicInfoUpdated = { ...basicInfo, ...getValues() }; + setBasicInfo(basicInfoUpdated); + setActiveStep(CreateDaoSteps.Config); + }; + + const tokenNumberSubtitile = ( + + Enter number of tokens to be minted (IMPORTANT: they + will be sent to the current connected wallet address + ). + + ); + + return ( + +
+ + + { + if (/\s/.test(value)) { + return "Dao identifier can't contain spaces"; + } + return await daoExists(value); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + onChange(e.target.value.toLowerCase())} + status={!!error ? 'error' : 'normal'} + error={error ? error.message : null} + /> + )} + /> + ( + { + handleIsExistingToken(e, onChange); + }} + selected={value} + items={['New Token', 'Existing Token']} + paddingSettings={{ + horizontal: spacing * 2, + vertical: spacing / 4, + }} + /> + )} + /> + + {!watch('isExistingToken') ? ( + <> + + + ( + + )} + /> + + + ( + + )} + /> + + + + The created token will use {tokenDecimals} decimals. For the amount, Don't append 0's. + + validateAmountForDecimals(value, tokenDecimals), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + ) : ( + validateToken(value, provider), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + )} + + + Proxies + +
+ +
+ Use Proxies - Employ Govern Executor and Queue to + heavily reduce gas costs for your DAO deployment, while maintaining full security and + autonomy. +
+
+ +
+
+ ); +}; + +export default CreateDaoBasicInfo; diff --git a/packages/govern-console/src/containers/CreateDao/CreateDaoCollateral.tsx b/packages/govern-console/src/containers/CreateDao/CreateDaoCollateral.tsx new file mode 100644 index 000000000..134665e72 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDaoCollateral.tsx @@ -0,0 +1,426 @@ +import React from 'react'; +import { CreateDaoSteps } from './utils/Shared'; +import { useCreateDaoContext } from './utils/CreateDaoContextProvider'; +import { useForm, Controller, useFieldArray } from 'react-hook-form'; +import { validateToken, validateAmountForDecimals } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import { getTokenInfo } from 'utils/token'; +import { formatUnits } from 'utils/lib'; +import { MAX_SCHEDULE_ACCESS_LIST_ALLOWED } from 'utils/constants'; +import { constants } from 'ethers'; +import { + useLayout, + TextInput, + ContentSwitcher, + Box, + Button, + StyledText, + Split, + Info, + IconMinus, + IconPlus, + IconArrowLeft, + SPACING, + useTheme, + GU, +} from '@aragon/ui'; +import StepsHeader from './components/StepsHeader'; + +const CreateDaoCollateral: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const { layoutName } = useLayout(); + const theme = useTheme(); + const spacing = SPACING[layoutName]; + const { collaterals, setCollaterals, basicInfo } = useCreateDaoContext(); + const { + scheduleAddress, + scheduleAmount, + scheduleDecimals, + isScheduleNewDaoToken, + challengeAddress, + challengeAmount, + challengeDecimals, + isChallengeNewDaoToken, + isAnyAddress, + executionAddressList, + } = collaterals; + + const context: any = useWallet(); + const { provider } = context; + + const methods = useForm({ + defaultValues: { + scheduleAddress, + scheduleDecimals, + scheduleAmount: formatUnits(scheduleAmount, scheduleDecimals), + challengeAddress, + challengeDecimals, + challengeAmount: formatUnits(challengeAmount, challengeDecimals), + isAnyAddress, + isScheduleNewDaoToken, + isChallengeNewDaoToken, + executionAddressList: executionAddressList.map((address) => { + return { value: address }; + }), + }, + }); + + const { + control, + watch, + getValues, + setValue, + trigger, + formState: { errors }, + } = methods; + + const isExistingToken = basicInfo.isExistingToken; + + const { fields, append, remove } = useFieldArray({ + control, + name: 'executionAddressList', + }); + + const moveToNextStep = async (isBack: boolean) => { + await trigger(); + + if (Object.keys(errors).length > 0 && !isBack) return; + + const data = { ...getValues() }; + data.executionAddressList = data.executionAddressList.map((item: any) => item.value); + + setCollaterals(data); + if (isBack) { + setActiveStep(CreateDaoSteps.Config); + } else { + setActiveStep(CreateDaoSteps.Review); + } + }; + + return ( + +
+ + +
+ Collaterals + + Collateral is required to schedule or challenge any transaction. The default currency + for collateral is DAI. To override the default, provide another contract address or use + your newly created DAO token. + +
+ + + Carefully review your collateral contract address. An incorrect address may lock your DAO. + +
+ {!isExistingToken ? ( + ( + + )} + /> + ) : ( +
+ Schedule execution collateral token + + Choose which token may be used to schedule a transaction. + +
+ )} + + { + const v = await validateToken(value, provider); + if (v !== true) { + return v; + } + + let { decimals } = await getTokenInfo(value, provider); + decimals = decimals || 0; + + setValue('scheduleDecimals', decimals); + + await trigger('scheduleAmount'); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + + validateAmountForDecimals(value, watch('scheduleDecimals')), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> +
+ +
+ {!isExistingToken ? ( + ( + + )} + /> + ) : ( +
+ Challenge collateral token + + Choose which token may be used to challenge a transaction. + +
+ )} + { + const v = await validateToken(value, provider); + if (v !== true) { + return v; + } + + let { decimals } = await getTokenInfo(value, provider); + decimals = decimals || 0; + + setValue('challengeDecimals', decimals); + + await trigger('challengeAmount'); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + validateAmountForDecimals(value, watch('challengeDecimals')), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> +
+
+ ( + + Limit the addresses that may schedule transactions.{' '} + Caution: if these addresses are + incorrect or unavailable, your DAO will be locked. + + } + onChange={onChange} + selected={value} + items={['Address List', 'Any Address']} + paddingSettings={{ + horizontal: spacing * 2, + vertical: spacing / 4, + }} + /> + )} + /> +
+ {watch('isAnyAddress') ? ( + + If you select ”Any Address”, then everybody can schedule executions in your DAO. Please + be sure you understand the impact of this selection. + + ) : ( +
+ {fields.map((item: any, index: number) => { + return ( +
+
+ ( + + )} + /> + +
+
+ ); + })} +
+ )} + + moveToNextStep(true)} + icon={} + label={'Back'} + display={'all'} + /> + } + secondary={ +
+
+ ); +}; + +export default CreateDaoCollateral; diff --git a/packages/govern-console/src/containers/CreateDao/CreateDaoConfig.tsx b/packages/govern-console/src/containers/CreateDao/CreateDaoConfig.tsx new file mode 100644 index 000000000..6f4d0cbe2 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDaoConfig.tsx @@ -0,0 +1,224 @@ +import React, { useEffect } from 'react'; +import { CreateDaoSteps } from './utils/Shared'; +import { useCreateDaoContext, ICreateDaoConfig } from './utils/CreateDaoContextProvider'; +import { useForm, Controller, FormProvider } from 'react-hook-form'; +import { validateContract } from 'utils/validations'; +import { useWallet } from 'AugmentedWallet'; +import { IPFSInput } from 'components/Field/IPFSInput'; +import { positiveNumber } from 'utils/validations'; +import { networkEnvironment } from 'environment'; + +import { + useLayout, + Grid, + GridItem, + TextInput, + Checkbox, + Box, + Button, + StyledText, + IconBlank, + Info, + Link, + SPACING, + IconArrowLeft, + Split, + useTheme, +} from '@aragon/ui'; +import StepsHeader from './components/StepsHeader'; + +const CreateDaoConfig: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + const { defaultDaoConfig: defaultConfig } = networkEnvironment; + const { config, setConfig } = useCreateDaoContext(); + const { executionDelay, resolver, customResolver, isRuleFile, ruleFile, ruleText } = config; + + const context: any = useWallet(); + const { provider } = context; + + const methods = useForm(); + const { control, setValue, getValues, trigger, watch } = methods; + + useEffect(() => { + setValue('ruleText', ruleText); + setValue('isRuleFile', isRuleFile); + setValue('ruleFile', ruleFile); + setValue('customResolver', customResolver); + }, [ruleText, isRuleFile, ruleFile, resolver, customResolver, setValue]); + + const moveToNextStep = async (isBack: boolean) => { + const validate = await trigger(); + if (!validate && !isBack) return; + + const newConfig = { ...config, ...getValues() }; + setConfig(newConfig); + + if (isBack) { + setActiveStep(CreateDaoSteps.BasicInfo); + } else { + setActiveStep(CreateDaoSteps.Collateral); + } + }; + + return ( + +
+ + + positiveNumber(value), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + + + Your DAO has optimistic capabilities, meaning that transactions can happen without + voting, but should follow pre defined rules. Please provide the main agreement for + your DAO (In text, or upload a file). You can use and edit the following text as + required, or use{' '} + + this template + {' '} + for a more complete agreement. + + } + shouldUnregister={false} + placeholder="Please insert your DAO agreement" + isFile="isRuleFile" + textInputName="ruleText" + fileInputName="ruleFile" + rows={6} + /> + + +
+ Dispute resolution client + + The resolver is a smart contract that can handle disputes in your DAO and follows the + ERC3k interface. By default your DAO will use Aragon Court as a resolver.{' '} + Learn more + + + + + validateContract(value, provider), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + } + adornmentPosition="end" + onChange={onChange} + status={!!error ? 'error' : 'normal'} + error={error ? error.message : null} + /> + )} + /> + + + + + + +
+ + {watch('customResolver') && ( + + Carefully review the client address and ensure your chosen client is compatible with + Govern. An incorrect address or incompatible client may lock your DAO. + + )} + + moveToNextStep(true)} + icon={} + label={'Back'} + display={'all'} + /> + } + secondary={ + + } + /> +
+
+ ); +}; + +export default CreateDaoConfig; diff --git a/packages/govern-console/src/containers/CreateDao/CreateDaoProgress.tsx b/packages/govern-console/src/containers/CreateDao/CreateDaoProgress.tsx new file mode 100644 index 000000000..2b0fad37f --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDaoProgress.tsx @@ -0,0 +1,277 @@ +import React, { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; +import progressImage from '../../images/svgs/CreateDaoInProgress.svg'; +import { CreateDaoSteps } from './utils/Shared'; +import { useCreateDaoContext } from './utils/CreateDaoContextProvider'; +import ProgressComponent from './components/ProgressComponent'; +import { CircularProgressStatus } from 'utils/types'; +import { parseUnits } from 'utils/lib'; +import { constants } from 'ethers'; +import { networkEnvironment } from 'environment'; +import { trackEvent, EventType } from 'services/analytics'; + +const { daoFactoryAddress, governRegistryAddress } = networkEnvironment; + +import { + createDao, + CreateDaoParams, + DaoConfig, + Token, + registerToken, + isTokenRegistered, +} from '@aragon/govern'; +import { addToIpfs } from 'utils/ipfs'; +import { BytesLike } from '@ethersproject/bytes'; +import { useWallet } from 'AugmentedWallet'; +import FailAction from './components/FailAction'; +import SuccessAction from './components/SuccessAction'; +import RegisterSuccessAction from './components/RegisterSuccessAction'; + +declare let window: any; + +const CreateDaoProgress: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const { networkName } = networkEnvironment; + const walletContext: any = useWallet(); + const { provider, account } = walletContext; + const { basicInfo, config, collaterals } = useCreateDaoContext(); + const [progressList, setProgressList] = useState([ + { status: CircularProgressStatus.InProgress, text: 'Uploading rules to IPFS' }, + { status: CircularProgressStatus.Disabled, text: 'Creating DAO' }, + ]); + const [action, setAction] = useState(null); + const [showAction, setShowAction] = useState<'none' | 'fail' | 'register' | 'finish'>('none'); + const [rule, SetRule] = useState(''); + const [isNewDaoTokenRegistered, setIsNewDaoTokenRegistered] = useState(false); + const [daoTokenAddress, setDaoTokenAddress] = useState('0x'); + + const updateNewCreatedDaoInfo = (token: string, excecutor: string) => { + setDaoTokenAddress(token); + + // analytics + trackEvent(EventType.DAO_CREATED, { + network: networkName, + dao_identifier: basicInfo.daoIdentifier, + dao_address: excecutor, + }); + }; + + useEffect(() => { + const checkIfRegistered = async () => { + if (daoTokenAddress !== '0x' && progressList[1].status !== CircularProgressStatus.Done) { + const isRegistered = await isTokenRegistered(provider.getSigner(), daoTokenAddress); + setIsNewDaoTokenRegistered(isRegistered); + + // update create dao status + const newList2 = [...progressList]; + newList2[1].status = CircularProgressStatus.Done; + setProgressList(newList2); + setShowAction('register'); + } + }; + checkIfRegistered(); + }, [daoTokenAddress, provider, progressList]); + + const createDaoParams: CreateDaoParams = useMemo(() => { + // token + let token: Partial; + if (basicInfo.isExistingToken) { + token = { + tokenAddress: basicInfo.tokenAddress, + }; + } else { + token = { + tokenDecimals: basicInfo.tokenDecimals, + tokenName: basicInfo.tokenName, + tokenSymbol: basicInfo.tokenSymbol, + mintAddress: account.address, + mintAmount: + basicInfo.tokenDecimals > 0 + ? parseUnits(basicInfo.tokenMintAmount, basicInfo.tokenDecimals) + : basicInfo.tokenMintAmount, + merkleRoot: '0x' + '00'.repeat(32), + merkleMintAmount: 0, + merkleTree: '0x', + merkleContext: '0x', + }; + } + + // config + const daoConfig: DaoConfig = { + executionDelay: config.executionDelay, + scheduleDeposit: { + token: collaterals.isScheduleNewDaoToken + ? constants.AddressZero + : collaterals.scheduleAddress, + amount: + collaterals.scheduleDecimals > 0 + ? parseUnits(collaterals.scheduleAmount, collaterals.scheduleDecimals) + : collaterals.scheduleAmount, + }, + challengeDeposit: { + token: collaterals.isChallengeNewDaoToken + ? constants.AddressZero + : collaterals.challengeAddress, + amount: + collaterals.challengeDecimals > 0 + ? parseUnits(collaterals.challengeAmount, collaterals.challengeDecimals) + : collaterals.challengeAmount, + }, + resolver: config.resolver, + rules: rule, + maxCalldataSize: config.maxCalldataSize, + }; + + // CreateDaoParams + return { + token, + scheduleAccessList: collaterals.isAnyAddress ? [] : collaterals.executionAddressList, + useProxies: basicInfo.isProxy, + config: daoConfig, + name: basicInfo.daoIdentifier, + }; + }, [basicInfo, config, collaterals, rule, account]); + + const tokenRegister = useCallback(async () => { + if (daoTokenAddress === '0x') { + console.log('wrong address', daoTokenAddress); + return; + } + + const newList = [...progressList]; + const registerProgressPosition = progressList.length; + newList.push({ + status: CircularProgressStatus.InProgress, + text: 'Registering token on Aragon Voice', + }); + setProgressList(newList); + setShowAction('none'); + try { + await registerToken(provider.getSigner(), daoTokenAddress); + // if register successfull + newList[registerProgressPosition].status = CircularProgressStatus.Done; + setProgressList([...newList]); + // setAction(); + setShowAction('finish'); + } catch (error) { + console.log('error', error); + // if register fail + newList[registerProgressPosition].status = CircularProgressStatus.Failed; + setProgressList([...newList]); + // TODO: in this case what we do with failed register + setShowAction('register'); + } + }, [progressList, provider, daoTokenAddress]); + + // start creating dao + // this component assumes all configs and input needed for created a DAO is provided + // so it start trying to create the DAO once componentDidMount + // first by uploading rules to IPFS + // second by actually creating the DAO + /* eslint-disable */ + useEffect(() => { + const uploadToIpfs = async () => { + const newList = [...progressList]; + try { + const ruleCid = await addToIpfs(config.isRuleFile ? config.ruleFile[0] : config.ruleText); + SetRule(ruleCid); + newList[0].status = CircularProgressStatus.Done; + setProgressList(newList); + } catch (error) { + console.log('error', error); + newList[0].status = CircularProgressStatus.Failed; + setProgressList(newList); + setShowAction('fail'); + return; + } + }; + uploadToIpfs(); + }, []); + // creating the DAO + useEffect(() => { + const callCreateDao = async () => { + if (rule !== '') { + const newList = [...progressList]; + try { + newList[1].status = CircularProgressStatus.InProgress; + setProgressList(newList); + const result: any = await createDao( + createDaoParams, + { + provider: window.ethereum, + daoFactoryAddress: daoFactoryAddress, + governRegistry: governRegistryAddress, + }, + updateNewCreatedDaoInfo, + ); + await result.wait(); + } catch (error) { + console.log('error', error); + + // analytics + trackEvent(EventType.DAO_CREATIONFAILED, { + network: networkName, + error: error.message || error.reason, + }); + + newList[1].status = CircularProgressStatus.Failed; + setProgressList(newList); + setShowAction('fail'); + } + } + }; + callCreateDao(); + }, [rule]); + /* eslint-disable */ + + useEffect(() => { + switch (showAction) { + case 'fail': + setAction(); + break; + + case 'register': + setAction( + , + ); + break; + + case 'finish': + setAction(); + break; + + default: + setAction(null); + break; + } + }, [ + showAction, + isNewDaoTokenRegistered, + daoTokenAddress, + tokenRegister, + setActiveStep, + basicInfo, + ]); + + return ( + + ); +}; + +export default CreateDaoProgress; diff --git a/packages/govern-console/src/containers/CreateDao/CreateDaoReview.tsx b/packages/govern-console/src/containers/CreateDao/CreateDaoReview.tsx new file mode 100644 index 000000000..ed11be714 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/CreateDaoReview.tsx @@ -0,0 +1,206 @@ +import React, { useMemo, useState } from 'react'; +import addressIcon from '../../images/connected-user-icon.svg'; +import { CreateDaoSteps, configArray, basicInfoArray, collateralArray } from './utils/Shared'; +import { useCreateDaoContext } from './utils/CreateDaoContextProvider'; +import { useWallet } from 'AugmentedWallet'; +import { trackEvent, EventType } from 'services/analytics'; + +import { + useLayout, + Grid, + GridItem, + Box, + Button, + ButtonText, + StyledText, + Info, + DataView, + Modal, + AddressField, +} from '@aragon/ui'; +import StepsHeader from './components/StepsHeader'; +import { networkEnvironment } from 'environment'; + +const CreateDaoReview: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const { networkName } = networkEnvironment; + const context: any = useWallet(); + const { isConnected } = context; + + const { layoutName } = useLayout(); + const { basicInfo, config, collaterals } = useCreateDaoContext(); + const [opened, setOpened] = useState(false); + // prepare data for the + const basicInfoData = useMemo(() => basicInfoArray(basicInfo), [basicInfo]); + const configData = useMemo(() => configArray(config), [config]); + const collateralData = useMemo(() => { + const datas = collateralArray(collaterals); + if (collaterals.executionAddressList.length > 0) { + const dataModified = datas.map((data) => { + if (typeof data.value !== 'string') { + return { + name: data.name, + value: ( + setOpened(true)}> + {collaterals.executionAddressList.length} addresses + + ), + }; + } + return data; + }); + return dataModified; + } + + return datas; + }, [collaterals]); + + return ( + <> + setOpened(false)}> + Schedule transaction whitelist addresses + {collaterals.executionAddressList.map((addr, i) => ( +
+ } + /> +
+ ))} +
+ + + + + + Check that your settings are correct. Some of these settings cannot be modified once the + DAO has been created. + + + + + Basic Info + + + { + setActiveStep(CreateDaoSteps.BasicInfo); + }} + > + Edit Basic Info + + + + + { + return [ + + {name} + , + + {value} + , + ]; + }} + /> + + + + Config + + + { + setActiveStep(CreateDaoSteps.Config); + }} + > + Edit Config + + + + + { + return [ + + {name} + , + + {value} + , + ]; + }} + /> + + + + Collaterals + + + { + setActiveStep(CreateDaoSteps.Collateral); + }} + > + Edit Collaterals + + + + + { + return [ + + {name} + , + + {value} + , + ]; + }} + /> + {/*
*/} + {!isConnected && ( + +
+ + Connect your wallet to be able to create a dao. + +
+ )} + + +
+ + ); +}; + +export default CreateDaoReview; diff --git a/packages/govern-console/src/containers/CreateDao/components/FailAction.tsx b/packages/govern-console/src/containers/CreateDao/components/FailAction.tsx new file mode 100644 index 000000000..d6cd4c750 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/FailAction.tsx @@ -0,0 +1,26 @@ +import { Button, StyledText, useTheme } from '@aragon/ui'; +import { CreateDaoSteps } from '../utils/Shared'; + +const FailAction: React.FC<{ + setActiveStep: React.Dispatch>; +}> = ({ setActiveStep }) => { + const theme = useTheme(); + return ( +
+ Something went wrong + + Please review your DAO inputs and try again. + + +
+ ); +}; + +export default FailAction; diff --git a/packages/govern-console/src/containers/CreateDao/components/ProgressComponent.tsx b/packages/govern-console/src/containers/CreateDao/components/ProgressComponent.tsx new file mode 100644 index 000000000..01a732b21 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/ProgressComponent.tsx @@ -0,0 +1,60 @@ +import React, { ReactNode } from 'react'; +import { Box, Grid, GridItem, StyledText, Info } from '@aragon/ui'; +import { CircularProgressStatus } from 'utils/types'; +import { ANCircularProgressWithCaption } from 'components/CircularProgress/ANCircularProgressWithCaption'; + +export interface ICreateDaoProgress { + status: CircularProgressStatus; + text: string; +} +export interface ICreateDaoProgressModal { + image?: string; + title?: string; + subTitle?: string; + info?: string; + progressList?: ICreateDaoProgress[]; + action?: ReactNode | null; +} +const ProgressComponent: React.FC = ({ + image, + title, + subTitle, + info, + progressList, + action, +}) => { + return ( + + + + + + + {title && {title}} + {subTitle && {subTitle}} + {progressList && + progressList.map((item, index) => ( + + ))} + {action} + + {info && ( + + {info} + + )} + + + ); +}; + +export default ProgressComponent; diff --git a/packages/govern-console/src/containers/CreateDao/components/RegisterSuccessAction.tsx b/packages/govern-console/src/containers/CreateDao/components/RegisterSuccessAction.tsx new file mode 100644 index 000000000..9df0b1540 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/RegisterSuccessAction.tsx @@ -0,0 +1,21 @@ +import { Button, SPACING, useLayout } from '@aragon/ui'; +import { useHistory } from 'react-router'; + +const RegisterSuccessAction: React.FC<{ daoIdentifier: string }> = ({ daoIdentifier }) => { + const { layoutName } = useLayout(); + const history = useHistory(); + + const goToDaoPage = () => history.push('daos/' + daoIdentifier); + return ( + + ); +}; + +export default RegisterSuccessAction; diff --git a/packages/govern-console/src/containers/CreateDao/components/ReviewCard.tsx b/packages/govern-console/src/containers/CreateDao/components/ReviewCard.tsx new file mode 100644 index 000000000..8de733afd --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/ReviewCard.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import cardMainImage from '../../../images/pngs/review_create_dao@2x.png'; +import { EmptyStateCard, StyledText, useTheme } from '@aragon/ui'; + +const ReviewCard: React.FC = () => { + const theme = useTheme(); + const cardText = ( +
+ Please, take your time and review all the info! + + Carefully review all of your settings. + +
+ ); + const cardIamge = ; + + return ( + + ); +}; + +export default ReviewCard; diff --git a/packages/govern-console/src/containers/CreateDao/components/StepsHeader.tsx b/packages/govern-console/src/containers/CreateDao/components/StepsHeader.tsx new file mode 100644 index 000000000..8eec51c19 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/StepsHeader.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Grid, GridItem, Steps, StyledText } from '@aragon/ui'; +import { stepsNames } from '../utils/Shared'; + +const StepsHeader: React.FC<{ index: number }> = ({ index }) => { + return ( + + + + + + Create DAO + + + ); +}; + +export default StepsHeader; diff --git a/packages/govern-console/src/containers/CreateDao/components/SuccessAction.tsx b/packages/govern-console/src/containers/CreateDao/components/SuccessAction.tsx new file mode 100644 index 000000000..2d1f1aafe --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/components/SuccessAction.tsx @@ -0,0 +1,65 @@ +import { Button, StyledText, useTheme, SPACING, useLayout } from '@aragon/ui'; +import { useHistory } from 'react-router'; + +const SuccessAction: React.FC<{ + isNewDaoTokenRegistered: boolean; + daoTokenAddress: string; + tokenRegister: () => void; + daoIdentifier: string; +}> = ({ isNewDaoTokenRegistered, tokenRegister, daoIdentifier }) => { + const { layoutName } = useLayout(); + const theme = useTheme(); + const history = useHistory(); + + const goToDaoPage = () => history.push('daos/' + daoIdentifier); + return ( +
+ + Your DAO is ready.{' '} + {!isNewDaoTokenRegistered && 'Next, register your token on Aragon Voice.'} + + + {isNewDaoTokenRegistered ? ( +
+
+ ) : ( +
+ + Voice enables gasless (non-binding) governance proposals and votes. + + +
+ )} +
+ ); +}; + +export default SuccessAction; diff --git a/packages/govern-console/src/containers/CreateDao/utils/CreateDaoContextProvider.tsx b/packages/govern-console/src/containers/CreateDao/utils/CreateDaoContextProvider.tsx new file mode 100644 index 000000000..da58a006c --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/utils/CreateDaoContextProvider.tsx @@ -0,0 +1,131 @@ +import React, { useMemo, useState, useContext, useCallback } from 'react'; +import { BigNumber, BytesLike } from 'ethers'; +import { networkEnvironment } from 'environment'; + +export interface ICreateDaoBasicInfo { + daoIdentifier: string; + isExistingToken: boolean; + tokenName: string; + tokenSymbol: string; + tokenDecimals: number; + tokenAddress: string; + tokenMintAmount: BigNumber | string; + isProxy: boolean; +} + +export interface ICreateDaoConfig { + executionDelay: number; + isRuleFile: boolean; + ruleFile: any; + ruleText: BytesLike; + resolver: string; + maxCalldataSize: number; + customResolver: boolean; // true if the user has entered new resolver. +} + +export interface ICreateDaoCollaterals { + isScheduleNewDaoToken: number; + scheduleAddress: string; + scheduleAmount: BigNumber | string; + scheduleDecimals: number; + isChallengeNewDaoToken: number; + challengeAddress: string; + challengeAmount: BigNumber | string; + challengeDecimals: number; + isAnyAddress: boolean; + executionAddressList: string[]; +} + +export interface CreateDaoContext { + // basic info + basicInfo: ICreateDaoBasicInfo; + setBasicInfo: (basicInfo: ICreateDaoBasicInfo) => void; + // config + config: ICreateDaoConfig; + setConfig: (config: ICreateDaoConfig) => void; + // collaterals + collaterals: ICreateDaoCollaterals; + setCollaterals: (collaterals: ICreateDaoCollaterals) => void; + + handleIsExistingToken: (e: any, onChange: (e: any) => void) => void; +} + +const UseCreateDao = React.createContext(null); + +const CreateDaoProvider: React.FC = ({ children }) => { + const { defaultDaoConfig: defaultConfig } = networkEnvironment; + + const [basicInfo, setBasicInfo] = useState({ + daoIdentifier: '', + isExistingToken: false, + tokenName: '', + tokenSymbol: '', + tokenAddress: '', + tokenDecimals: 18, + tokenMintAmount: '', + isProxy: true, + }); + + const [config, setConfig] = useState({ + executionDelay: parseInt(defaultConfig.executionDelay.toString()), + isRuleFile: false, + ruleFile: '', + ruleText: defaultConfig.rules, + resolver: defaultConfig.resolver, + maxCalldataSize: defaultConfig.maxCalldataSize, + customResolver: false, + }); + + const [collaterals, setCollaterals] = useState({ + isScheduleNewDaoToken: 0, + scheduleAddress: defaultConfig.scheduleDeposit.token, + scheduleAmount: BigNumber.from(defaultConfig.scheduleDeposit.amount), + scheduleDecimals: 18, // TODO: this should be coming from the config + isChallengeNewDaoToken: 0, + challengeAddress: defaultConfig.challengeDeposit.token, + challengeAmount: BigNumber.from(defaultConfig.challengeDeposit.amount), + challengeDecimals: 18, // TODO: this should be coming from the config + isAnyAddress: false, + executionAddressList: [''], + }); + + const handleIsExistingToken = useCallback( + (e: any, onChange: (e: any) => void) => { + // this will reset isScheduleNewDaoToken & isChallengeNewDaoToken + // if isExistingToken is set + if (e === 1) { + setCollaterals({ + ...collaterals, + isScheduleNewDaoToken: 0, + isChallengeNewDaoToken: 0, + }); + } + onChange(e); + }, + [collaterals], + ); + + const contextValue = useMemo( + (): CreateDaoContext => ({ + basicInfo, + setBasicInfo, + + config, + setConfig, + + collaterals, + setCollaterals, + + handleIsExistingToken, + }), + [basicInfo, config, collaterals, handleIsExistingToken], + ); + + return {children}; +}; + +function useCreateDaoContext(): CreateDaoContext { + return useContext(UseCreateDao) as CreateDaoContext; +} + +export { CreateDaoProvider, useCreateDaoContext }; diff --git a/packages/govern-console/src/containers/CreateDao/utils/Shared.tsx b/packages/govern-console/src/containers/CreateDao/utils/Shared.tsx new file mode 100644 index 000000000..a700858b0 --- /dev/null +++ b/packages/govern-console/src/containers/CreateDao/utils/Shared.tsx @@ -0,0 +1,167 @@ +import { toUtf8String } from 'ethers/lib/utils'; +import { + ICreateDaoBasicInfo, + ICreateDaoConfig, + ICreateDaoCollaterals, +} from './CreateDaoContextProvider'; + +enum CreateDaoSteps { + BasicInfo, + Config, + Collateral, + Review, + Progress, +} + +const stepsNames = ['Basic info', 'Config', 'Collaterals', 'Review']; + +const formatParamNames: { [key: string]: string } = { + daoIdentifier: 'DAO Identifier', + isExistingToken: 'Use Existing Token', + tokenName: 'Token Name', + tokenSymbol: 'Token Symbol', + tokenAddress: 'Token Address', + tokenMintAmount: 'Token Mint Amount', + isProxy: 'Use Proxy', + + executionDelay: 'Execution Delay', + isRuleFile: 'Use Rule File', + ruleFile: 'DAO Agreement', + ruleText: 'DAO Agreement', + resolver: 'Dispute resolution client', + maxCalldataSize: 'Max Call Data Size', + + scheduleAddress: 'Schedule Token Address', + scheduleAmount: 'Schedule Token Amount', + isScheduleNewDaoToken: 'Use Schedule New Dao Token', + challengeAddress: 'Challenge Token Address', + challengeAmount: 'Challenge Token Amount', + isChallengeNewDaoToken: 'Use Challenge New Dao Token', + isAnyAddress: 'Scheduling transaction whitelist', + executionAddressList: 'Scheduling transaction whitelist', +}; + +export type BasicInfoArg = + | 'daoIdentifier' + | 'isExistingToken' + | 'tokenName' + | 'tokenSymbol' + | 'tokenDecimals' + | 'tokenAddress' + | 'tokenMintAmount' + | 'isProxy'; + +export type ConfigArgs = 'executionDelay' | 'isRuleFile' | 'ruleFile' | 'ruleText' | 'resolver'; + +export type CollateralsArgs = + | 'scheduleAddress' + | 'scheduleAmount' + | 'isScheduleNewDaoToken' + | 'challengeAddress' + | 'challengeAmount' + | 'isChallengeNewDaoToken' + | 'isAnyAddress' + | 'executionAddressList'; + +const basicInfoArray = (basicInfo: ICreateDaoBasicInfo) => { + const filters: (keyof ICreateDaoBasicInfo)[] = basicInfo.isExistingToken + ? ['tokenDecimals', 'isExistingToken', 'tokenName', 'tokenSymbol', 'tokenMintAmount'] + : ['tokenDecimals', 'isExistingToken', 'tokenAddress']; + + const formatValue = (name: string, value: any) => { + switch (name) { + case 'isProxy': + return value ? 'Yes' : 'No'; + + default: + return value.toString(); + } + }; + + return Object.entries(basicInfo) + .filter((entry) => !filters.includes(entry[0] as any)) + .map((entry) => ({ + name: formatParamNames[entry[0]?.toString()], + value: formatValue(entry[0], entry[1]), + })); +}; + +const configArray = (config: ICreateDaoConfig) => { + const formatValue = (name: string, value: any) => { + switch (name) { + case 'ruleFile': + return value[0].name; + + case 'ruleText': + return value && typeof value !== 'string' ? toUtf8String(value) : value; + + case 'executionDelay': + return `${value} seconds`; + + default: + return value.toString(); + } + }; + + const filters: (keyof ICreateDaoConfig)[] = !config.isRuleFile + ? ['maxCalldataSize', 'customResolver', 'isRuleFile', 'ruleFile'] + : ['maxCalldataSize', 'customResolver', 'isRuleFile', 'ruleText']; + + return Object.entries(config) + .filter((entry) => !filters.includes(entry[0] as any)) + .map((entry) => ({ + name: formatParamNames[entry[0]?.toString()], + value: formatValue(entry[0], entry[1]), + })); +}; + +const collateralArray = (collaterals: ICreateDaoCollaterals) => { + const formatValue = (name: string, value: any) => { + if ( + (name === 'scheduleAddress' && collaterals.isScheduleNewDaoToken) || + (name === 'challengeAddress' && collaterals.isChallengeNewDaoToken) + ) + return 'New DAO token'; + + if (name === 'isScheduleNewDaoToken' || name === 'isChallengeNewDaoToken') + return Boolean(value) ? 'Yes' : 'No'; + + if (name === 'isAnyAddress') { + return 'Any Address'; + } + + return value; + }; + + const filters: (keyof ICreateDaoCollaterals)[] = collaterals.isAnyAddress + ? [ + 'scheduleDecimals', + 'challengeDecimals', + 'executionAddressList', + 'isChallengeNewDaoToken', + 'isScheduleNewDaoToken', + ] + : [ + 'scheduleDecimals', + 'challengeDecimals', + 'isAnyAddress', + 'isChallengeNewDaoToken', + 'isScheduleNewDaoToken', + ]; + + return Object.entries(collaterals) + .filter((entry) => !filters.includes(entry[0] as any)) + .map((entry) => ({ + name: formatParamNames[entry[0]?.toString()], + value: formatValue(entry[0], entry[1]), + })); +}; + +export { + stepsNames, + formatParamNames, + CreateDaoSteps, + basicInfoArray, + collateralArray, + configArray, +}; diff --git a/packages/govern-console/src/containers/DAO/DaoMainPage.tsx b/packages/govern-console/src/containers/DAO/DaoMainPage.tsx new file mode 100644 index 000000000..03691dfc6 --- /dev/null +++ b/packages/govern-console/src/containers/DAO/DaoMainPage.tsx @@ -0,0 +1,238 @@ +import React, { useState, useEffect, memo } from 'react'; +import { styled } from '@material-ui/core/styles'; +import { DaoHeader } from 'components/DaoHeader/DaoHeader'; +import { ProposalCard } from 'components/ProposalCards/ProposalCard'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import { useHistory, useParams } from 'react-router-dom'; +import NoDaoFound from './NoDaoFound'; +import { formatDate } from 'utils/date'; +import { getState, getStateColor } from 'utils/states'; +import { useDaoQuery, useLazyProposalListQuery } from 'hooks/query-hooks'; +import { proposalDetailsUrl } from 'utils/urls'; +import { Button } from '@aragon/ui'; + +//* Styled Components List +const DaoPageMainDiv = styled(Paper)(({ theme }) => ({ + width: '100%', + background: theme.custom.white, + minHeight: 'inherit', + padding: '0px', + boxSizing: 'border-box', + boxShadow: 'none', +})); + +const PageLabelSelected = styled(Typography)(({ theme }) => ({ + background: 'linear-gradient(282.07deg, #01E8F7 -5.08%, #01DCFA 21.97%, #00C2FF 81.4%)', + lineHeight: '25px', + fontSize: '20px', + fontWeight: 500, + fontFamily: theme.custom.daoCard.fontFamily, + fontStyle: theme.custom.daoCard.fontStyle, + WebkitBackgroundClip: 'text', + WebkitTextFillColor: 'transparent', + cursor: 'pointer', +})); + +const PageLabel = styled(Typography)(({ theme }) => ({ + color: '#7483AB', + lineHeight: '25px', + fontSize: '20px', + fontWeight: 500, + fontFamily: theme.custom.daoCard.fontFamily, + fontStyle: theme.custom.daoCard.fontStyle, + cursor: 'pointer', +})); + +const WrapperGrid = styled(Grid)({ + marginTop: '16px', + boxSizing: 'border-box', + margin: '0 !important', + width: '100% !important', +}); +//* Styled Components List End + +const DaoMainPage: React.FC = () => { + const history = useHistory(); + const { daoName } = useParams(); + //TODO daoname empty handling + + const { data: dao, loading: loadingDao } = useDaoQuery(daoName); + + const [isProposalPage, setProposalPage] = useState(true); + const [visibleProposalList, updateVisibleProposalList] = useState([]); + const [queueNonce, updateQueueNonce] = useState(); + const [daoDetails, updateDaoDetails] = useState(); + const [isAnExistingDao, updateIsAnExistingDao] = useState(true); + + const onPageChange = (page: string) => { + if (page === 'profile') { + setProposalPage(false); + // setProfilePage(true); + } else { + setProposalPage(true); + // setProfilePage(false); + } + }; + + const { getQueueData, data, fetchMore } = useLazyProposalListQuery(); + + const fetchMoreData = async () => { + if (fetchMore) { + fetchMore({ + variables: { + offset: visibleProposalList.length, + }, + }); + } + }; + + useEffect(() => { + if (data) { + updateVisibleProposalList(data.governQueue.containers); + updateQueueNonce(parseInt(data.governQueue.nonce)); + } + }, [data]); + + useEffect(() => { + if (loadingDao) return; + + if (dao && getQueueData) { + updateIsAnExistingDao(true); + updateDaoDetails(dao); + if (dao && dao.queue) { + getQueueData({ + variables: { + offset: 0, + limit: 16, + id: dao.queue.id, + }, + }); + } + } else { + updateIsAnExistingDao(false); + } + }, [loadingDao, dao, getQueueData]); + + const onClickProposal = (proposal: any) => { + history.push(proposalDetailsUrl(daoName, proposal.id)); + }; + + const goToNewExecution = () => { + history.push(`/daos/${daoName}/new-execution`); + }; + + if (loadingDao) { + return
Loading...
; + } + + if (isAnExistingDao) { + return ( + + {daoDetails === undefined ? ( + 'loading' + ) : ( + <> + +
+
+ {isProposalPage ? ( + Transactions + ) : ( + onPageChange('proposal')}>Proposal + )} + {/* {isProfilePage ? ( + Profile + ) : ( + onPageChange('profile')}> + Profile + + )} */} +
+ {isProposalPage ? ( +
+
+
+ + {visibleProposalList.map((proposal: any) => ( + + onClickProposal(proposal)} + > + + ))} + + +
+ {queueNonce !== visibleProposalList.length ? ( +
+
+ ) : ( + <> + )} +
+ + )} +
+ ); + } else { + return ; + } +}; +export default memo(DaoMainPage); diff --git a/packages/govern-console/src/containers/DAO/NoDaoFound.tsx b/packages/govern-console/src/containers/DAO/NoDaoFound.tsx new file mode 100644 index 000000000..38bb56303 --- /dev/null +++ b/packages/govern-console/src/containers/DAO/NoDaoFound.tsx @@ -0,0 +1,115 @@ +import React, { useState, memo } from 'react'; +import { styled } from '@material-ui/core/styles'; +import { ANButton } from 'components/Button/ANButton'; +import { InputField } from 'components/InputFields/InputField'; +import { useHistory } from 'react-router-dom'; +import MUITypography from '@material-ui/core/Typography'; +import daoNoutFound from 'images/dao-not-found.svg'; +import { useToast } from '@aragon/ui'; + +const VerticalAlignWrapper = styled('div')({ + height: 'fit-content', + width: 'fit-content', + padding: '120px', + margin: 'auto', +}); + +const Subtitle = styled(MUITypography)(({ theme }) => ({ + color: theme.custom.daoHeader.labelColor, + lineHeight: '27px', + fontSize: '18px', + fontWeight: theme.custom.daoHeader.labelFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +const Title = styled(MUITypography)(({ theme }: any) => ({ + color: theme.custom.daoHeader.valueColor, + lineHeight: '60.1px', + fontSize: '44px', + fontWeight: theme.custom.daoHeader.valueFontWeight, + fontFamily: theme.typography.fontFamily, + fontStyle: 'normal', +})); + +const DaoNotFoundWrapper = styled('div')({ + width: '100%', + height: '100%', + textAlign: 'center', + background: ' linear-gradient(107.79deg, #E4F8FF 1.46%, #F1F1FF 100%)', + borderRadius: '16px', + boxSizing: 'border-box', + position: 'relative', +}); + +const RowFlexDiv = styled('div')({ + display: 'flex', + flexDirection: 'row', + marginTop: '22px', +}); + +const NotFoundImage = styled('img')({ + width: '236px', + height: '225px', +}); + +const NoDaoFound: React.FC = () => { + const history = useHistory(); + const toast = useToast(); + + const onGotoDao = () => { + if (daoSearchText.length > 0) { + history.push(`${daoSearchText}`); + } else { + toast('Invalid DAO Name. At least one letter should be entered.'); + } + }; + + const handleKeyPress = (e: any) => { + if (e.key === 'Enter') { + onGotoDao(); + } + }; + + const [daoSearchText, updateDaoSearchText] = useState(''); + const onInputChange = (updatedText: string) => { + updateDaoSearchText(updatedText); + }; + + return ( + <> + + + + DAO not found + You can try with other DAO name + +
+ +
+
+ +
+
+
+
+ + ); +}; +export default memo(NoDaoFound); diff --git a/packages/govern-console/src/containers/DAOSettings/DAOSettings.tsx b/packages/govern-console/src/containers/DAOSettings/DAOSettings.tsx new file mode 100644 index 000000000..260a3a78d --- /dev/null +++ b/packages/govern-console/src/containers/DAOSettings/DAOSettings.tsx @@ -0,0 +1,540 @@ +import React, { useState, memo, useEffect } from 'react'; +import { useHistory, useParams } from 'react-router-dom'; +import backButtonIcon from '../../images/back-btn.svg'; +import { BackButton } from 'styles'; +import { buildConfig } from 'utils/ERC3000'; +import { useWallet } from 'AugmentedWallet'; +import { DaoConfig } from '@aragon/govern'; +import { CustomTransaction } from 'utils/types'; +import { ActionTypes, ModalsContext } from 'containers/HomePage/ModalsContext'; +import { useForm, Controller, FormProvider } from 'react-hook-form'; +import { ContractReceipt } from 'ethers'; +import { validateToken, validateContract, validateAmountForDecimals } from 'utils/validations'; +import { Proposal, ReceiptType } from '@aragon/govern'; +import { useToast } from '@aragon/ui'; +import { toUTF8String } from 'utils/lib'; +import { proposalDetailsUrl } from 'utils/urls'; +import { addToIpfs, fetchIPFS } from 'utils/ipfs'; +import { IPFSInput } from 'components/Field/IPFSInput'; +import { useFacadeProposal } from 'hooks/proposal-hooks'; +import { useDaoQuery } from 'hooks/query-hooks'; +import { ipfsMetadata } from 'utils/types'; +import { formatUnits, parseUnits } from 'utils/lib'; +import { getTokenInfo } from 'utils/token'; +import { positiveNumber } from 'utils/validations'; +import { ANCircularProgressWithCaption } from 'components/CircularProgress/ANCircularProgressWithCaption'; +import { CircularProgressStatus } from 'utils/types'; + +import { + useLayout, + Grid, + GridItem, + TextInput, + TextCopy, + Box, + Button, + StyledText, + SPACING, + useTheme, + Link, + IconBlank, + Checkbox, +} from '@aragon/ui'; +import PageContent from 'components/PageContent/PageContent'; +import SettingsCard from './components/SettingsCard'; + +export interface DaoSettingFormProps { + /** + * on click back + */ + onClickBack: () => void; +} + +interface ParamTypes { + /** + * type of path (url) params + */ + daoName: string; +} + +interface FormInputs { + daoConfig: DaoConfig; + proof: string; + isRuleFile: boolean; + rulesFile: any; + proofFile: any; +} + +const DaoSettings: React.FC = () => { + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + const history = useHistory(); + const context: any = useWallet(); + const { account, isConnected, provider } = context; + const { dispatch } = React.useContext(ModalsContext); + const toast = useToast(); + const methods = useForm(); + const { control, setValue, getValues, handleSubmit, trigger } = methods; + const { daoName } = useParams(); + //TODO daoname empty handling + const { data: dao } = useDaoQuery(daoName); + const [daoDetails, updateDaoDetails] = useState(); + const [config, setConfig] = useState(undefined); + const [daoAddresses, setDaoAddresses] = useState<{ executorAddress: string; token: string }>({ + executorAddress: '', + token: '', + }); + const [ipfsMetadata, setIpfsMetadata] = useState(); + const [ipfsRulesLoading, setIpfsRulesLoading] = useState(true); + + const [scheduleDecimals, setScheduleDecimals] = useState(0); + const [challengeDecimals, setChallengeDecimals] = useState(0); + const [resolverLock, setResolverLock] = useState(false); + + const updateResolverLock = (lock: boolean) => { + if (!lock) { + setValue('daoConfig.resolver', config.resolver); + } + setResolverLock(lock); + }; + + useEffect(() => { + if (dao) { + updateDaoDetails(dao); + } + }, [dao]); + + const proposalInstance = useFacadeProposal( + daoDetails?.queue.address, + daoDetails?.queue.config.resolver, + ); + + const transactionsQueue = React.useRef([]); + + useEffect(() => { + return function cleanUp() { + transactionsQueue.current = []; + }; + }, []); + + useEffect(() => { + const _loadRules = async (rules: string) => { + // config.rules IPFS handling with utf8string fallback. + const ipfsRules = await fetchIPFS(rules); + setIpfsRulesLoading(false); + if (ipfsRules) { + setIpfsMetadata(ipfsRules); + setValue('daoConfig.rules', ipfsRules.text || ''); + } else { + setValue('daoConfig.rules', toUTF8String(rules) || rules); + } + }; + + const _load = async () => { + // config is also used as a check in order to set and populate + // the UI with current Dao's config only once + if (daoDetails && provider && !config && setValue) { + const _config = daoDetails.queue.config; + const _daoAddresses = { + executorAddress: daoDetails.executor.address, + token: daoDetails.token, + }; + setConfig(_config); + setDaoAddresses(_daoAddresses); + + // copy the nested objects so we can change the amount values + const formConfig = buildConfig(_config); + + setScheduleDecimals(_config.scheduleDeposit.decimals); + setChallengeDecimals(_config.challengeDeposit.decimals); + + // can/should be extracted in the transformProposals in useQuery hooks. + formConfig.scheduleDeposit.amount = formatUnits( + _config.scheduleDeposit.amount, + _config.scheduleDeposit.decimals, + ); + formConfig.challengeDeposit.amount = formatUnits( + _config.challengeDeposit.amount, + _config.challengeDeposit.decimals, + ); + setValue('daoConfig', formConfig); + _loadRules(_config.rules); + } + }; + _load(); + }, [daoDetails, provider, config, setValue]); + + const getRule = async (isRuleFile: number | boolean, textRule: string) => { + if (Number(isRuleFile) === 1) { + if (getValues('rulesFile') instanceof FileList) { + return await addToIpfs(getValues('rulesFile')[0]); + } + } else { + if (textRule !== ipfsMetadata?.text) { + return await addToIpfs(textRule); + } + } + return config.rules; + }; + + const callSaveSetting = async (formData: FormInputs) => { + const newConfig: DaoConfig = formData.daoConfig; + let containerHash: string | undefined; + + newConfig.rules = await getRule(getValues('isRuleFile'), newConfig.rules.toString()); + + // Upload proof to ipfs + const proof = getValues('proofFile') ? getValues('proofFile')[0] : getValues('proof'); + const proofCid = await addToIpfs(proof, { + title: 'DAO Configuration change', + }); + + // if the amount contains `.`, means it's a fractional component + // and we need to parse it to bignumber again for smart contract + if (newConfig.scheduleDeposit.amount.toString().includes('.')) { + newConfig.scheduleDeposit.amount = parseUnits( + newConfig.scheduleDeposit.amount, + scheduleDecimals, + ); + } + if (newConfig.challengeDeposit.amount.toString().includes('.')) { + newConfig.challengeDeposit.amount = parseUnits( + newConfig.challengeDeposit.amount, + challengeDecimals, + ); + } + + // payload for the final container + const payload = { + submitter: account.address, + executor: daoDetails.executor.address, + actions: [proposalInstance?.buildAction('configure', [newConfig], 0)], + proof: proofCid, + }; + + if (proposalInstance) { + try { + transactionsQueue.current = await proposalInstance.schedule(payload, buildConfig(config)); + } catch (error) { + toast(error.message); + return; + } + } + + dispatch({ + type: ActionTypes.OPEN_TRANSACTIONS_MODAL, + payload: { + transactionList: transactionsQueue.current, + onTransactionFailure: () => { + /* do nothing */ + }, + onTransactionSuccess: (_, receipt: ContractReceipt) => { + containerHash = Proposal.getContainerHashFromReceipt(receipt, ReceiptType.Scheduled); + }, + onCompleteAllTransactions: () => { + if (containerHash) { + history.push(proposalDetailsUrl(daoName, containerHash)); + } + }, + }, + }); + }; + + return ( + }> + + history.goBack()}> + + +
+ DAO Settings + + + +
+ Resolver + + The resolver is a smart contract that can handle disputes in your DAO and follows + the ERC3k interface. By default your DAO will use Aragon Court as a resolver.{' '} + Learn more + + + + + { + return validateContract(value, provider); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + } + adornmentPosition="end" + onChange={onChange} + status={!!error ? 'error' : 'normal'} + error={error ? error.message : null} + /> + )} + /> + + + + + + +
+ positiveNumber(value), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + + {ipfsRulesLoading ? ( + + ) : ( + + Your DAO has optimistic capabilities, meaning that transactions can happen + without voting, but should follow pre defined rules. Please provide the main + agreement for your DAO (In text, or upload a file). You can use{' '} + + this template + {' '} + to create your agreement. + + } + placeholder="Please insert your DAO agreement" + ipfsMetadata={ipfsMetadata} + shouldUnregister={false} + textInputName="daoConfig.rules" + fileInputName="rulesFile" + isFile="isRuleFile" + rows={6} + /> + )} + +
+ Collaterals + + { + 'In order to schedule or challenge executions, any member must provide this amount of collateral, so they have stake in the game and act with the best interest of your DAO' + } + +
+ + { + const v = await validateToken(value, provider); + if (v !== true) { + return v; + } + + let { decimals } = await getTokenInfo(value, provider); + decimals = decimals || 0; + + setScheduleDecimals(decimals); + await trigger('daoConfig.scheduleDeposit.amount'); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + validateAmountForDecimals(value, scheduleDecimals), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + { + const v = await validateToken(value, provider); + if (v !== true) { + return v; + } + + let { decimals } = await getTokenInfo(value, provider); + decimals = decimals || 0; + + setChallengeDecimals(decimals); + + await trigger('daoConfig.challengeDeposit.amount'); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + validateAmountForDecimals(value, challengeDecimals), + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> + {/* { + return validateContract(value, provider); + }, + }} + render={({ field: { onChange, value }, fieldState: { error } }) => ( + + )} + /> */} + + +
+
+
+
+
+
+ ); +}; + +export default memo(DaoSettings); diff --git a/packages/govern-console/src/containers/DAOSettings/components/SettingsCard.tsx b/packages/govern-console/src/containers/DAOSettings/components/SettingsCard.tsx new file mode 100644 index 000000000..8a93c2286 --- /dev/null +++ b/packages/govern-console/src/containers/DAOSettings/components/SettingsCard.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import cardMainImage from 'images/pngs/dao_setting_@2x.png'; +import { EmptyStateCard, StyledText, useTheme } from '@aragon/ui'; + +const SettingsCard: React.FC = () => { + const theme = useTheme(); + const cardText = ( +
+ Your DAO settings + + Carefully review your changes as some settings may break or lock your DAO. + +
+ ); + const cardIamge = ; + + return ( + + ); +}; + +export default SettingsCard; diff --git a/packages/govern-console/src/containers/HomePage/HomePage.tsx b/packages/govern-console/src/containers/HomePage/HomePage.tsx new file mode 100644 index 000000000..d6c93000d --- /dev/null +++ b/packages/govern-console/src/containers/HomePage/HomePage.tsx @@ -0,0 +1,59 @@ +import { Switch, Route } from 'react-router-dom'; +import { useHistory } from 'react-router-dom'; +import Header from 'components/Header/Header'; +import Footer from 'components/Footer/Footer'; +import ConsoleMainPage from 'containers/Console/ConsoleMainPage'; +import DaoMainPage from 'containers/DAO/DaoMainPage'; +import ProposalDetails from 'containers/ProposalDetails/ProposalDetails'; +import NewExecution from 'containers/NewExecution/NewExecution'; +import DaoSettings from 'containers/DAOSettings/DAOSettings'; +import { ModalsProvider } from 'containers/HomePage/ModalsContext'; +import { Main } from '@aragon/ui'; +import CreateDao from 'containers/CreateDao/CreateDao'; +import { trackPage } from 'services/analytics'; +import { useLocation } from 'react-router-dom'; +import { useEffect } from 'react'; +import scrollToTop from 'utils/scrollToId'; + +const HomePage = () => { + const history = useHistory(); + const { pathname } = useLocation(); + + useEffect(() => { + trackPage(pathname); + + // scroll to top on path change + scrollToTop(); + }, [pathname]); + + return ( + +
+
+ + + + + + + + + history.goBack()} /> + + + + + + history.goBack()} /> + + + + + +
+
+
+ ); +}; + +export default HomePage; diff --git a/packages/govern-console/src/containers/HomePage/ModalsContext.tsx b/packages/govern-console/src/containers/HomePage/ModalsContext.tsx new file mode 100644 index 000000000..fcc492931 --- /dev/null +++ b/packages/govern-console/src/containers/HomePage/ModalsContext.tsx @@ -0,0 +1,100 @@ +import React, { createContext, Dispatch, useReducer } from 'react'; +import TransctionsModal from 'components/Modal/TransactionsModal'; +import { CustomTransaction } from 'utils/types'; +export enum ActionTypes { + OPEN_TRANSACTIONS_MODAL = 'OPEN_TRANSACTIONS_MODAL', + CLOSE = 'CLOSE', +} +type TransactionsModalAction = { + type: ActionTypes.OPEN_TRANSACTIONS_MODAL; + payload: { + transactionList: CustomTransaction[]; + onTransactionFailure?: (errorMessage: string, transaction: CustomTransaction) => void; + onTransactionSuccess?: (updatedTransaction: CustomTransaction, transactionReceipt: any) => void; + onCompleteAllTransactions?: (transactions: CustomTransaction[]) => void; + }; +}; + +type CloseAction = { + type: ActionTypes.CLOSE; + payload: { + modal: keyof ModalContextState; + }; +}; + +type ModalsContextAction = TransactionsModalAction | CloseAction; + +interface ModalContextState { + transactionsModal: { + open: boolean; + params: { + transactionList: CustomTransaction[]; + onTransactionFailure?: (errorMessage: string, transaction: CustomTransaction) => void; + onTransactionSuccess?: ( + updatedTransaction: CustomTransaction, + transactionReceipt: any, + ) => void; + onCompleteAllTransactions?: (transactions: CustomTransaction[]) => void; + }; + }; +} + +interface Context { + state: ModalContextState; + dispatch: Dispatch; +} + +const INITIAL_STATE: ModalContextState = { + transactionsModal: { + open: false, + params: { + transactionList: [], + onTransactionFailure: () => { + // do nothing + }, + onTransactionSuccess: () => { + // do nothing + }, + onCompleteAllTransactions: () => { + // do nothing + }, + }, + }, +}; + +export const ModalsContext = createContext({ + state: INITIAL_STATE, + dispatch: () => null, +}); + +const reducer = (state: ModalContextState, action: ModalsContextAction): ModalContextState => { + switch (action.type) { + case ActionTypes.OPEN_TRANSACTIONS_MODAL: + return { + ...state, + transactionsModal: { open: true, params: { ...action.payload } }, + }; + case ActionTypes.CLOSE: + return INITIAL_STATE; + default: + throw new Error(`Unrecognized action in Modals Provider`); + } +}; + +export const ModalsProvider: React.FC = ({ children }) => { + const [state, dispatch] = useReducer(reducer, INITIAL_STATE); + + return ( + + {children} + + + ); +}; + +export const closeTransactionsModalAction: CloseAction = { + type: ActionTypes.CLOSE, + payload: { + modal: 'transactionsModal', + }, +}; diff --git a/packages/govern-console/src/containers/NewExecution/ActionList.tsx b/packages/govern-console/src/containers/NewExecution/ActionList.tsx new file mode 100644 index 000000000..fdbbd3e86 --- /dev/null +++ b/packages/govern-console/src/containers/NewExecution/ActionList.tsx @@ -0,0 +1,196 @@ +import React, { memo } from 'react'; +import { + TextInput, + Card, + Box, + useTheme, + useLayout, + ButtonIcon, + IconUp, + IconDown, + IconCross, + GU, + Grid, + StyledText, + Help, + SPACING, +} from '@aragon/ui'; +import { ActionItem } from 'utils/types'; +import { Controller, useFormContext } from 'react-hook-form'; +import { getTruncatedAccountAddress } from 'utils/account'; + +type ActionListProps = { + actions: Array; + swap: (indexA: number, indexB: number) => void; + remove: (index: number) => void; +}; + +type ActionHeaderProps = { + contractAddress: string; + index: number; + count: number; + swap: (indexA: number, indexB: number) => void; + remove: (index: number) => void; +}; + +const ActionHeader: React.FC = memo(function ActionHeader({ + contractAddress, + index, + count, + swap, + remove, +}) { + const theme = useTheme(); + const { layoutName } = useLayout(); + + return ( +
+
+ Contract:{' '} + + {layoutName === 'small' ? getTruncatedAccountAddress(contractAddress) : contractAddress} + +
+
+
+ 0 ? () => swap(index, index - 1) : undefined}> + + + swap(index, index + 1) : undefined} + > + + +
+
+ remove(index)}> + + +
+
+
+ ); +}); + +const ActionList: React.FC = ({ actions, swap, remove }) => { + const { control } = useFormContext(); + const theme = useTheme(); + const { layoutName } = useLayout(); + const spacing = SPACING[layoutName]; + + if (actions && actions.length === 0) { + return ( + + No transaction yet. + + ); + } + + return ( +
+ {actions.map((action, index: number) => ( + h1 { + height: auto !important; + } + `} + key={action.id} + heading={ + + } + > + + + {action.inputs.map((input: any, num: number) => { + const element = ( + ( + + )} + /> + ); + return element; + })} + {action.payable && ( +
+ +
+
payable amount
+
+ + The amount of ether to forward to the contract + +
+
+
+ ( + + )} + /> +
+ )} +
+
+
+ ))} +
+ ); +}; + +export default memo(ActionList); diff --git a/packages/govern-console/src/containers/NewExecution/NewExecution.tsx b/packages/govern-console/src/containers/NewExecution/NewExecution.tsx new file mode 100644 index 000000000..6797cbc04 --- /dev/null +++ b/packages/govern-console/src/containers/NewExecution/NewExecution.tsx @@ -0,0 +1,240 @@ +import React, { memo, useState, useCallback } from 'react'; +import { + IconAdd, + Grid, + GridItem, + Button, + StyledText, + Link, + TextInput, + Box, + useToast, +} from '@aragon/ui'; +import { PageName } from 'utils/HelpText'; +import backButtonIcon from '../../images/back-btn.svg'; +import { BackButton } from 'styles'; + +import PageContent from 'components/PageContent/PageContent'; +import ActionList from 'containers/NewExecution/ActionList'; +import { ActionBuilder } from 'components/ActionBuilder/ActionBuilder'; +import { useParams, useHistory } from 'react-router-dom'; +import { ContractReceipt } from 'ethers'; +import { useWallet } from 'AugmentedWallet'; +import { buildConfig } from 'utils/ERC3000'; +import { CustomTransaction, ActionItem } from 'utils/types'; +import { ActionTypes, ModalsContext } from 'containers/HomePage/ModalsContext'; +import { useForm, FormProvider, Controller, useFieldArray } from 'react-hook-form'; +import { Proposal, ReceiptType, ActionType } from '@aragon/govern'; +import { proposalDetailsUrl } from 'utils/urls'; +import { addToIpfs } from 'utils/ipfs'; +import { useFacadeProposal } from 'hooks/proposal-hooks'; +import { IPFSInput } from 'components/Field/IPFSInput'; +import { settingsUrl } from 'utils/urls'; +import { useDaoQuery } from 'hooks/query-hooks'; +import { Error } from 'utils/Error'; +import AbiHandler from 'utils/AbiHandler'; + +interface FormInputs { + proof: string; + proofFile: any; + title: string; + actions: ActionItem[]; +} + +const NewExecution: React.FC = () => { + const history = useHistory(); + + //TODO daoname empty handling + const { daoName } = useParams(); + const { data: daoDetails } = useDaoQuery(daoName); + + const toast = useToast(); + const { dispatch } = React.useContext(ModalsContext); + + // form + const methods = useForm(); + const { control, getValues, handleSubmit } = methods; + const { fields, append, swap, remove } = useFieldArray({ + control, + name: 'actions', + }); + + const [showActionModal, setShowActionModal] = useState(false); + + const context: any = useWallet(); + const { account, isConnected } = context; + + const proposalInstance = useFacadeProposal( + daoDetails?.queue.address, + daoDetails?.queue.config.resolver, + ); + + const transactionsQueue = React.useRef([]); + + const openActionModal = useCallback(() => { + if (isConnected) { + setShowActionModal(true); + } else { + toast(Error.ConnectAccount); + } + }, [isConnected, setShowActionModal, toast]); + + const onCloseActionModal = useCallback( + (actions: any) => { + if (actions) { + append(actions); + } + setShowActionModal(false); + }, + [append], + ); + + const validate = () => { + const actions = getValues('actions'); + if (!actions || actions.length === 0) { + toast('At least one action is needed to schedule an execution.'); + return false; + } + return true; + }; + + const onSchedule = () => { + if (!validate()) return; + + const actions = getValues('actions'); + try { + const encodedActions = AbiHandler.encodeActions(actions); + scheduleProposal(encodedActions); + } catch (err) { + console.log('Failed to encode action data', err); + toast('Error encoding action data, please double check your action input.'); + } + }; + + const scheduleProposal = async (actions: ActionType[]) => { + // TODO: add modal + + const proof = getValues('proofFile') ? getValues('proofFile')[0] : getValues('proof'); + const proofCid = await addToIpfs(proof, { + title: getValues('title'), + }); + + let containerHash: string | undefined; + + // build the container to schedule. + const payload = { + submitter: account.address, + executor: daoDetails.executor.address, + actions: actions, + proof: proofCid, + }; + + if (proposalInstance) { + try { + transactionsQueue.current = await proposalInstance.schedule( + payload, + buildConfig(daoDetails.queue.config), + ); + } catch (error) { + console.log('Failed scheduling', error); + toast(error.message); + return; + } + } + + dispatch({ + type: ActionTypes.OPEN_TRANSACTIONS_MODAL, + payload: { + transactionList: transactionsQueue.current, + onTransactionSuccess: (_, receipt: ContractReceipt) => { + containerHash = Proposal.getContainerHashFromReceipt(receipt, ReceiptType.Scheduled); + }, + onCompleteAllTransactions: () => { + if (containerHash) { + history.push(proposalDetailsUrl(daoName, containerHash)); + } + }, + }, + }); + }; + + return ( + + + history.goBack()}> + + + + + New transaction + + This execution will use the current{' '} + history.push(settingsUrl(daoName))}>DAO Settings + + + + + ( + + )} + /> + + + + + + Transactions + + Batch as many transactions as you like into a single execution. + + +
+ +
+ + {showActionModal && ( + + )} +
+
+
+
+ ); +}; + +export default memo(NewExecution); diff --git a/packages/govern-console/src/containers/ProposalDetails/ProposalDetails.tsx b/packages/govern-console/src/containers/ProposalDetails/ProposalDetails.tsx new file mode 100644 index 000000000..17b579254 --- /dev/null +++ b/packages/govern-console/src/containers/ProposalDetails/ProposalDetails.tsx @@ -0,0 +1,657 @@ +/* eslint-disable */ +import React, { useEffect, useMemo, useCallback } from 'react'; +import { styled } from '@material-ui/core/styles'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import backButtonIcon from 'images/back-btn.svg'; +import { Label } from 'components/Labels/Label'; +import { useParams } from 'react-router-dom'; +import { useWallet } from '../../AugmentedWallet'; +import { CustomTransaction } from 'utils/types'; +import { getProposalParams } from 'utils/ERC3000'; +import { ActionTypes, ModalsContext } from 'containers/HomePage/ModalsContext'; +import AbiHandler from 'utils/AbiHandler'; +import { formatDate } from 'utils/date'; +import { getState, getStateColor } from 'utils/states'; +import { useToast } from '@aragon/ui'; +import { IPFSField } from 'components/Field/IPFSField'; +import { addToIpfs, fetchIPFS } from 'utils/ipfs'; +import { useFacadeProposal } from 'hooks/proposal-hooks'; +import { useLazyProposalQuery, useDaoQuery } from 'hooks/query-hooks'; +import { ipfsMetadata } from 'utils/types'; +import { formatUnits } from 'utils/lib'; +import { DecodedActionData } from './components/DecodedActionData'; + +// widget components +import ChallengeWidget from './components/ChallengeWidget'; +import ExecuteWidget from './components/ExecuteWidget'; +import ResolveWidget from './components/ResolveWidget'; +interface ProposalDetailsProps { + onClickBack?: any; +} + +//* styled Components + +const StyledPaper = styled(Paper)({ + backgroundColor: '#ffffff', + height: 'auto', + padding: '40px 48px 58px 48px', +}); +const BackButton = styled('div')({ + height: 25, + width: 62, + cursor: 'pointer', + position: 'relative', + marginBottom: '36px', + '& img': { + cursor: 'pointer', + }, +}); +const ProposalStatus = styled('div')({ + height: '20px', + width: '100%', + display: 'block', + boxSizing: 'border-box', +}); +const ProposalId = styled('div')(({ theme }) => ({ + width: '100%', + color: theme.custom.black, + fontWeight: 600, + fontSize: '32px', + lineHeight: '44px', + marginTop: '11px', + textOverflow: 'ellipsis', + boxSizing: 'border-box', + fontFamily: 'Manrope', +})); +const DateDisplay = styled('div')({ + height: '25px', + fontFamily: 'Manrope', + width: '100%', + color: '#7483B3', + marginTop: '10px', + fontStyle: 'normal', + fontWeight: 'normal', + boxSizing: 'border-box', +}); +const DetailsWrapper = styled('div')({ + display: 'flex', + justifyContent: 'space-between', + marginTop: '47px', + fontFamily: 'Manrope', +}); +const ProposalDetailsWrapper = styled('div')({ + width: 'calc(100% - 443px)', + boxSizing: 'border-box', + borderRadius: '16px', + minHeight: '900px', + border: ' 2px solid #E2ECF5', + padding: '32px 30px', + fontFamily: 'Manrope', +}); +const WidgetWrapper = styled('div')({ + width: '427px', +}); +const TitleText = styled(Typography)({ + fontWeight: 600, + fontSize: '28px', + lineHeight: '38px', + height: '38px', + width: '100%', + boxSizing: 'border-box', + fontFamily: 'Manrope', +}); +export const InfoWrapper = styled('div')({ + // display: 'flex', + // flexDirection: 'column', + // justifyContent: 'space-between', + marginTop: '9px', + width: '100%', + boxSizing: 'border-box', + height: 'fit-content', + fontFamily: 'Manrope', + overflow: 'hidden', +}); +export const InfoKeyDiv = styled('div')({ + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + fontSize: '18px', + minHeight: '25px', + height: 'fit-content', + width: 'fit-content', + display: 'inline-block', + verticalAlign: 'top', + color: '#7483B3', +}); +export const InfoValueDivInline = styled('div')({ + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + color: '#20232C', + display: 'inline-block', + width: 'fit-content', + marginLeft: '9px', + maxWidth: '100%', + textOverflow: 'ellipsis', + overflow: 'hidden', + verticalAlign: 'top', + minHeight: '25px', + lineHeight: '25px', + fontSize: '18px', + '& a': { + width: '100%', + color: '#0094FF', + boxSizing: 'border-box', + height: '25px', + display: 'block', + lineHeight: '25px', + }, +}); +const InfoValuePre = styled('pre')({ + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + color: '#20232C', + overflow: 'auto', + margin: '0', + '& a': { + color: '#0094FF', + }, +}); + +export const InfoValueDivBlock = styled('div')(({ maxlines }: { maxlines?: number }) => ({ + display: 'flex', + flexDirection: 'column', + minWidth: '75%', + height: 'auto', + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + color: '#20232C', + fontSize: '18px', + marginTop: '9px', + paddingLeft: '25px', + boxSizing: 'border-box', + maxWidth: '100%', + textOverflow: 'ellipsis', + overflow: 'hidden', + WebkitLineClamp: maxlines || 'none', + boxOrientation: 'vertical', + // wordBreak:'break-all', + '& a': { + display: 'block', + width: 'fit-content', + color: '#0094FF', + boxSizing: 'border-box', + }, + '& div': { + display: 'block', + height: 'auto', + width: '100%', + color: '#20232C', + boxSizing: 'border-box', + }, + '& > *': { + marginBottom: '9px', + }, + '& :last-child': { + marginBottom: '0 !important', + }, + '& .full-width': { + width: '100% !important', + }, +})); +const ActionsWrapper = styled('div')({ + display: 'flex', + flexDirection: 'column', + width: '100%', + height: 'auto', + '& > *': { + marginBottom: '8px', + }, + '& :last-child': { + marginBottom: '0 !important', + }, +}); + +const ActionDiv = styled('div')({ + background: '#FFFFFF', + transition: 'all 1s ease-out', + border: '2px solid #F5F7FF', + boxSizing: 'border-box', + boxShadow: '0px 8px 7px rgba(116, 131, 178, 0.2)', + borderRadius: '12px', + width: '100%', + overflow: 'hidden', + '& > div': { + alignItems: 'center', + width: '100%', + paddingTop: 0, + paddingBottom: 0, + + // lineHeight: '62px', + }, + '& > div:only-child': { + height: '62px !important', + }, + '& div': { + marginTop: 0, + }, + '& .full-width': { + width: '100%', + }, +}); + +const CollapsedDiv = styled('div')({ + cursor: 'pointer', + display: 'block', + width: '100%', + paddingLeft: '23px', + paddingRight: '28px', + boxSizing: 'border-box', + margin: 0, +}); +const ExpandedDiv = styled('div')({ + height: 'auto', + display: 'block', + width: '100%', + paddingLeft: '23px', + paddingRight: '38px', + boxSizing: 'border-box', + margin: 0, + '& #value-div': { + height: '30px', + lineHeight: '27px', + minHeight: '27px !important', + }, + '& #data-div': { + lineHeight: '25px', + minHeight: '27px !important', + // fontSize: '18px', + height: 'fit-content', + }, + '& #data-div-block': { + // overflowWrap: 'normal', + overflowWrap: 'break-word', + maxWidth: 'calc(100% - 48px)', + }, +}); + +//* End of styled Components + +const ProposalDetails: React.FC = ({ onClickBack }) => { + const { daoName, id: proposalId } = useParams(); + + const { data: dao } = useDaoQuery(daoName); + const context: any = useWallet(); + + const { networkName, isConnected } = context; + + const { dispatch } = React.useContext(ModalsContext); + const toast = useToast(); + + const [proposalInfo, updateProposalInfo] = React.useState(null); + const [decodedData, updateDecodedData] = React.useState({}); + const [decoding, setDecoding] = React.useState(false); + const [isExpanded, updateIsExpanded] = React.useState({}); + const [daoDetails, updateDaoDetails] = React.useState(); + const transactionsQueue = React.useRef([]); + + const [proof, setProof] = React.useState(); + const [rules, setRules] = React.useState(); + const [rulesLoading, setRulesLoading] = React.useState(true); + const [proofLoading, setProofsLoading] = React.useState(true); + + const abiHandler = useMemo(() => { + if (networkName) { + return new AbiHandler(networkName); + } + }, [networkName]); + + const proposalInstance = useFacadeProposal( + daoDetails?.queue.address, + proposalInfo?.config.resolver, + ); + + const { getProposalData, data: proposalDetailsData } = useLazyProposalQuery(); + + // USE EFFECTS + useEffect(() => { + return function cleanUp() { + transactionsQueue.current = []; + }; + }, []); + + useEffect(() => { + async function load() { + if (proposalDetailsData && proposalDetailsData.container) { + updateProposalInfo(proposalDetailsData.container); + + fetchIPFS(proposalDetailsData.container.config.rules).then((data) => { + setRules(data || proposalDetailsData.container.config.rules); + setRulesLoading(false); + }); + + fetchIPFS(proposalDetailsData.container.payload.proof).then((data) => { + setProof(data || proposalDetailsData.container.payload.proof); + setProofsLoading(false); + }); + } + } + load(); + }, [proposalDetailsData]); + + useEffect(() => { + if (dao && proposalId && getProposalData) { + updateDaoDetails(dao); + getProposalData({ + variables: { + id: proposalId, + }, + }); + } + }, [dao, proposalId, getProposalData]); + + const toggleDiv = async (index: number) => { + const cloneObject = { ...isExpanded }; + if (cloneObject[index]) { + cloneObject[index] = false; + } else { + cloneObject[index] = true; + } + updateIsExpanded(cloneObject); + + // try to decode action data if the div was expanded for the first time + if (cloneObject[index] && !decodedData[index] && abiHandler) { + setDecoding(true); + const action = proposalInfo.payload.actions[index]; + const abi = await abiHandler.get(action.to); + + if (abi) { + const data = AbiHandler.decode(abi, action.data); + if (data) { + updateDecodedData({ ...decodedData, [index]: data }); + } + } + setDecoding(false); + } + }; + + const challengeProposal = useCallback( + async (challengeReason: string, challengeReasonFile: any) => { + // TODO: add modal + const reason = challengeReasonFile ? challengeReasonFile[0] : challengeReason; + const reasonCid = await addToIpfs(reason); + + const proposalParams = getProposalParams(proposalInfo); + + if (proposalInstance) { + try { + transactionsQueue.current = await proposalInstance.challenge(proposalParams, reasonCid); + } catch (error) { + console.log('Failed challenging', error); + toast(error.message); + return; + } + } + + dispatch({ + type: ActionTypes.OPEN_TRANSACTIONS_MODAL, + payload: { + transactionList: transactionsQueue.current, + }, + }); + }, + [proposalInstance, transactionsQueue], + ); + + const executeProposal = useCallback(async () => { + const proposalParams = getProposalParams(proposalInfo); + if (proposalInstance) { + transactionsQueue.current = [...(await proposalInstance.execute(proposalParams))]; + } + + dispatch({ + type: ActionTypes.OPEN_TRANSACTIONS_MODAL, + payload: { + transactionList: transactionsQueue.current, + }, + }); + }, [proposalInstance, transactionsQueue]); + + const resolveProposal = useCallback( + async (disputeId: number) => { + const proposalParams = getProposalParams(proposalInfo); + + if (proposalInstance) { + transactionsQueue.current = [ + ...(await proposalInstance.resolve(proposalParams, disputeId)), + ]; + } + + dispatch({ + type: ActionTypes.OPEN_TRANSACTIONS_MODAL, + payload: { + transactionList: transactionsQueue.current, + }, + }); + }, + [proposalInstance, transactionsQueue], + ); + + const proposalStates: any = {}; + if (proposalInfo) { + proposalInfo.history.forEach((item: any) => { + proposalStates[item.__typename] = item; + }); + } + + if (!proposalInfo) { + return
Loading...
; + } + + return ( + + + + + + + {/* {proposalInfo.id} */} + {proof?.metadata && proof.metadata.title} + {formatDate(proposalInfo.createdAt)} + + + Config + + Execution Delay: + {proposalInfo.config.executionDelay} seconds + + + Schedule Deposit: + + {proposalInfo.config.scheduleDeposit.token} +
+ {formatUnits( + proposalInfo.config.scheduleDeposit.amount, + proposalInfo.config.scheduleDeposit.decimals, + )}{' '} + {proposalInfo.config.scheduleDeposit.symbol || 'TKN'} +
+
+
+ + Challenge Deposit: + + {proposalInfo.config.challengeDeposit.token} +
+ {formatUnits( + proposalInfo.config.challengeDeposit.amount, + proposalInfo.config.challengeDeposit.decimals, + )}{' '} + {proposalInfo.config.challengeDeposit.symbol || 'TKN'} +
+
+
+ + Resolver: + + {proposalInfo.config.resolver} + + + + Rules: + + + + +
+ + Payload + {(() => { + if (proof?.metadata) { + return ( + + Description: + {proof.metadata.title} + + ); + } + })()} + + Execution Time: + + {formatDate(proposalInfo.payload.executionTime)} + + + + Submitter: + {proposalInfo.payload.submitter} + + + Executor: + + {proposalInfo.payload.executor.address || 'No executor ID'} + + + + Justification: + + + + + + + Actions: + + {/* Show action accordians */} + {proposalInfo.payload.actions.map((action: any, index: number) => { + return ( + + toggleDiv(index)}> + + to + + {action.to} + + + {/* */} + + {isExpanded[index] && ( + + + value + + {action.value} + + + {decoding &&
Decoding data....
} + {!decoding && !decodedData[index] && ( + + data + + {action.data} + + + )} + {!decoding && decodedData[index] && ( + + + function + + {decodedData[index].functionName} + + + + arguments + + + + + + )} +
+ )} +
+ ); + })} +
+
+ + + { + + } + + { + + } + { + + } + + + + ); +}; + +export default ProposalDetails; diff --git a/packages/govern-console/src/containers/ProposalDetails/components/ChallengeWidget.tsx b/packages/govern-console/src/containers/ProposalDetails/components/ChallengeWidget.tsx new file mode 100644 index 000000000..62f861aa6 --- /dev/null +++ b/packages/govern-console/src/containers/ProposalDetails/components/ChallengeWidget.tsx @@ -0,0 +1,152 @@ +/* eslint-disable */ +import React, { memo, useState, useEffect, useCallback } from 'react'; +import { ANButton } from 'components/Button/ANButton'; +import { InputField } from 'components/InputFields/InputField'; +import { PROPOSAL_STATES } from 'utils/states'; +import { Link } from 'react-router-dom'; +import { toUTF8String } from 'utils/lib'; +import { useForm, Controller, FormProvider } from 'react-hook-form'; +import { HelpButton } from 'components/HelpButton/HelpButton'; + +import { InfoKeyDiv, InfoValueDivInline, InfoValueDivBlock } from '../ProposalDetails'; +import { Widget, WidgetRow, InfoWrapper, TitleText } from './SharedStyles'; +import { IPFSInput } from 'components/Field/IPFSInput'; +import { IPFSField } from 'components/Field/IPFSField'; +import { formatDate } from 'utils/date'; +import { getTruncatedAccountAddress } from 'utils/account'; +import { getIpfsUrl, fetchIPFS } from 'utils/ipfs'; +import { ipfsMetadata } from 'utils/types'; + +import { styled } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; + +import { Box, Button } from '@aragon/ui'; + +interface FormInputs { + reason: string; + isReasonFile: boolean; + reasonFile: any; +} + +// TODO: GIORGI repeating styles +export const InputSubTitle = styled(Typography)({ + width: 'fit-content', + fontFamily: 'Manrope', + fontStyle: 'normal', + fontWeight: 'normal', + fontSize: 18, + lineHeight: '25px', + color: '#7483AB', + marginTop: '17px', + marginBottom: '17px', +}); + +const ChallengeWidget: React.FC = ({ + disabled, + containerEventChallenge, + currentState, + onChallengeProposal, +}) => { + const [reason, setReason] = useState(); + const [loading, setLoading] = useState(true); + + const methods = useForm(); + const { + register, + control, + watch, + setValue, + getValues, + handleSubmit, + formState: { errors }, + } = methods; + + const submit = useCallback(() => { + onChallengeProposal(getValues('reason'), getValues('reasonFile')); + }, []); + + useEffect(() => { + async function getReason() { + const data = await fetchIPFS(containerEventChallenge.reason); + const reason = data || containerEventChallenge.reason; + setLoading(false); + setReason(reason); + } + if (containerEventChallenge) { + getReason(); + } + }, [containerEventChallenge]); + + if (containerEventChallenge) { + return ( + + + Challenge Details + + + Challenged At + + {formatDate(containerEventChallenge.createdAt)} + + + + Challenger + + {getTruncatedAccountAddress(containerEventChallenge.challenger)} + + + Challenge Reason + + + + + ); + } + + if (currentState !== PROPOSAL_STATES.SCHEDULED) { + return <>; + } + + return ( + + {/* + Challenge Reason{' '} + + */} + + + +
+ + ); +}; + +export default memo(ResolveWidget); diff --git a/packages/govern-console/src/containers/ProposalDetails/components/SharedStyles.tsx b/packages/govern-console/src/containers/ProposalDetails/components/SharedStyles.tsx new file mode 100644 index 000000000..e44dd3668 --- /dev/null +++ b/packages/govern-console/src/containers/ProposalDetails/components/SharedStyles.tsx @@ -0,0 +1,43 @@ +import Typography from '@material-ui/core/Typography'; +import { styled, Theme } from '@material-ui/core/styles'; +export const InfoWrapper = styled('div')({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%', + boxSizing: 'border-box', +}); +export const Widget = styled('div')({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + width: '100%', + minHeight: '118px', + boxSizing: 'border-box', + background: '#FFFFFF', + border: '2px solid #ECF1F7', + boxShadow: '0px 6px 6px rgba(180, 193, 228, 0.35)', + borderRadius: '8px', + marginBottom: '23px', + padding: '26px 28px', + '& button': { + marginTop: '5px', + }, +}); +export const WidgetRow = styled('div')( + ({ marginBottom }: { marginBottom?: string; theme: Theme }) => ({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%', + height: 'fit-content', + marginBottom: marginBottom || 0, + }), +); +export const TitleText = styled(Typography)({ + fontStyle: 'normal', + fontWeight: 500, + fontSize: '18px', + color: '#20232C', + marginBottom: '20px', +}); diff --git a/packages/govern-console/src/environment.ts b/packages/govern-console/src/environment.ts deleted file mode 100644 index bb68e4993..000000000 --- a/packages/govern-console/src/environment.ts +++ /dev/null @@ -1,57 +0,0 @@ -const CHAIN_ID_DEFAULT = 4 - -type EnvVarHelpers = { - CHAIN_ID: () => number - ENABLE_SENTRY: () => boolean - FORTMATIC_API_KEY: () => string - MAINNET_SUBGRAPH_URL: () => string - PORTIS_DAPP_ID: () => string - RINKEBY_SUBGRAPH_URL: () => string - SENTRY_DSN: () => string - SUBGRAPH_HTTP_ENDPOINT: () => string -} - -const ENV_VARS: EnvVarHelpers = { - CHAIN_ID(): number { - const chainId = parseInt(process.env.REACT_APP_CHAIN_ID ?? '4') - return isNaN(chainId) ? CHAIN_ID_DEFAULT : chainId - }, - ENABLE_SENTRY(): boolean { - return process.env.REACT_APP_ENABLE_SENTRY === '1' - }, - FORTMATIC_API_KEY(): string { - return process.env.REACT_APP_FORTMATIC_API_KEY || '' - }, - MAINNET_SUBGRAPH_URL(): string { - return ( - process.env.MAINNET_SUBGRAPH_URL || - // Setting a sensible default as a fallback, as the subgraph is the backbone - // of the app - 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-mainnet' - ) - }, - PORTIS_DAPP_ID(): string { - return process.env.REACT_APP_PORTIS_DAPP_ID || '' - }, - RINKEBY_SUBGRAPH_URL(): string { - return ( - process.env.REACT_APP_RINKEBY_SUBGRAPH_URL || - // Setting a sensible default as a fallback, as the subgraph is the backbone - // of the app - 'https://api.thegraph.com/subgraphs/name/evalir/aragon-govern-rinkeby' - ) - }, - SENTRY_DSN(): string { - const dsn = process.env.REACT_APP_SENTRY_DSN || '' - return dsn.trim() - }, - SUBGRAPH_HTTP_ENDPOINT(): string { - return process.env.REACT_APP_SUBGRAPH_HTTP_ENDPOINT || '' - }, -} - -export default function env( - name: T, -): ReturnType { - return ENV_VARS[name]() as ReturnType -} diff --git a/packages/govern-console/src/environment/index.ts b/packages/govern-console/src/environment/index.ts new file mode 100644 index 000000000..0a271701b --- /dev/null +++ b/packages/govern-console/src/environment/index.ts @@ -0,0 +1,14 @@ +import { getNetworkConfig } from './networks'; +import { EnvironmentName } from './types'; + +const DEFAULT_ENVIRONMENT = 'rinkeby'; + +function getNetworkEnvironment(environment: EnvironmentName) { + return getNetworkConfig(environment); +} + +export function getEnvironmentName(): EnvironmentName { + return (process.env.REACT_APP_ENVIRONMENT || DEFAULT_ENVIRONMENT) as EnvironmentName; +} + +export const networkEnvironment = getNetworkEnvironment(getEnvironmentName()); diff --git a/packages/govern-console/src/environment/networks.ts b/packages/govern-console/src/environment/networks.ts new file mode 100644 index 000000000..74738f51a --- /dev/null +++ b/packages/govern-console/src/environment/networks.ts @@ -0,0 +1,107 @@ +import { EnvironmentConfig, EnvironmentName } from './types'; + +const networks = new Map([ + [ + 'mainnet', + { + chainId: 1, + networkName: 'mainnet', + subgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-mainnet', + courtSubgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-court-v2-mainnet', + courtUrl: 'https://court.aragon.org/#', + voiceUrl: 'https://voice.aragon.org/', + daoFactoryAddress: '0x8bF05ce17B30f8C73B06e49f67076f944687c967', + governRegistryAddress: '0xf2b7D096cd34F228A6413e276132C21D98b19882', + defaultDaoConfig: { + executionDelay: 86400, // defaults to one day - how many seconds to wait before being able to call execute. + scheduleDeposit: { + token: '0x6b175474e89094c44da98b954eedeac495271d0f', + amount: '10000000000000000000', + }, + challengeDeposit: { + token: '0x6b175474e89094c44da98b954eedeac495271d0f', + amount: '10000000000000000000', + }, + resolver: '0xFb072baA713B01cE944A0515c3e1e98170977dAF', + rules: + 'Any transaction created in this DAO must have first been proposed in an Aragon Voice vote on https://voice.aragon.org/ and with the following approval criteria:\n\n67% support of the participating tokens in the vote proposal duration of at least 3 days.\n\nTransactions created that do not meet the above criteria should not be permitted.', // we use Bytes (ArrayLike) instead of string hex + maxCalldataSize: 100000, // initial maxCalldatasize + }, + curatedTokens: { + DAI: '0x6b175474e89094c44da98b954eedeac495271d0f', + USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', + USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }, + }, + ], + [ + 'rinkeby', + { + chainId: 4, + networkName: 'rinkeby', + subgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-rinkeby', + courtSubgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-court-v2-rinkeby', + courtUrl: 'https://court-rinkeby.aragon.org/#', + voiceUrl: 'http://voice-rinkeby.aragon.org/', + daoFactoryAddress: '0x46013753f3a02ab4239cA936632E6C6B39235CCE', + governRegistryAddress: '0xf46253ef29FaedAbf63AA8cA6c0A41CbbdC93948', + defaultDaoConfig: { + executionDelay: 180, + scheduleDeposit: { + token: '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735', + amount: '10000000000000000000', + }, + challengeDeposit: { + token: '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735', + amount: '10000000000000000000', + }, + resolver: '0xC464EB732A1D2f5BbD705727576065C91B2E9f18', + rules: + 'Any transaction created in this DAO must have first been proposed in an Aragon Voice vote on https://voice.aragon.org/ and with the following approval criteria:\n\n67% support of the participating tokens in the vote proposal duration of at least 3 days.\n\nTransactions created that do not meet the above criteria should not be permitted.', // we use Bytes (ArrayLike) instead of string hex + maxCalldataSize: 100000, + }, + curatedTokens: { + DAI: '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735', + USDT: '0x3B00Ef435fA4FcFF5C209a37d1f3dcff37c705aD', + USDC: '0xeb8f08a975Ab53E34D8a0330E0D34de942C95926', + }, + }, + ], + [ + 'staging', + { + chainId: 4, + networkName: 'rinkeby', + subgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-rinkeby-staging', + courtSubgraphUrl: 'https://api.thegraph.com/subgraphs/name/aragon/aragon-court-v2-staging', + courtUrl: 'https://court-rinkeby-staging.aragon.org/#', + voiceUrl: 'http://voice-rinkeby.aragon.org/', + daoFactoryAddress: '0x0f75Dd5E00f0A153fCee92A1C242Dbdf32D87196', + governRegistryAddress: '0xcc3F32957d316a12AFCFed04c0716af4814eCB2B', + defaultDaoConfig: { + executionDelay: 180, + scheduleDeposit: { + token: '0x8F2Ac3fD1a9Ce7208eFff7C31aC0e2A98b0778f3', + amount: '10000000000000000000', + }, + challengeDeposit: { + token: '0x8F2Ac3fD1a9Ce7208eFff7C31aC0e2A98b0778f3', + amount: '10000000000000000000', + }, + resolver: '0x9c003eC97676c30a041f128D671b3Db2f790c3E7', + rules: + 'Any transaction created in this DAO must have first been proposed in an Aragon Voice vote on https://voice.aragon.org/ and with the following approval criteria:\n\n67% support of the participating tokens in the vote proposal duration of at least 3 days.\n\nTransactions created that do not meet the above criteria should not be permitted.', // we use Bytes (ArrayLike) instead of string hex + maxCalldataSize: 100000, + }, + curatedTokens: { + DAI: '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735', + USDT: '0x3B00Ef435fA4FcFF5C209a37d1f3dcff37c705aD', + USDC: '0xeb8f08a975Ab53E34D8a0330E0D34de942C95926', + }, + }, + ], +]); + +export function getNetworkConfig(name: EnvironmentName): EnvironmentConfig { + return networks.get(name) as EnvironmentConfig; +} diff --git a/packages/govern-console/src/environment/types.ts b/packages/govern-console/src/environment/types.ts new file mode 100644 index 000000000..969a15006 --- /dev/null +++ b/packages/govern-console/src/environment/types.ts @@ -0,0 +1,31 @@ +import { Bytes } from 'ethers'; +export type EnvironmentName = 'mainnet' | 'rinkeby' | 'staging'; +type ChainId = 1 | 4; + +export type TokenSymbol = 'DAI' | 'USDT' | 'USDC'; +type TokenAddress = string; + +type Collateral = { + token: string; + amount: string; +}; + +export interface EnvironmentConfig { + chainId: ChainId; + networkName: string; + subgraphUrl: string; + courtSubgraphUrl: string; + courtUrl: string; + voiceUrl: string; + daoFactoryAddress: string; + governRegistryAddress: string; + defaultDaoConfig: { + executionDelay: number; + scheduleDeposit: Collateral; + challengeDeposit: Collateral; + resolver: string; + rules: string; + maxCalldataSize: number; + }; + curatedTokens: Record; +} diff --git a/packages/govern-console/src/global.d.ts b/packages/govern-console/src/global.d.ts new file mode 100644 index 000000000..466f90e25 --- /dev/null +++ b/packages/govern-console/src/global.d.ts @@ -0,0 +1,9 @@ +// https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31245#issuecomment-780019806 +import { CSSProp } from 'styled-components'; +import 'styled-components/cssprop'; + +declare module 'react' { + interface DOMAttributes { + css?: CSSProp; + } +} diff --git a/packages/govern-console/src/hooks/court-hooks.tsx b/packages/govern-console/src/hooks/court-hooks.tsx new file mode 100644 index 000000000..1c183dbe3 --- /dev/null +++ b/packages/govern-console/src/hooks/court-hooks.tsx @@ -0,0 +1,30 @@ +import { useEffect } from 'react'; +import { useLazyDisputeQuery } from 'hooks/query-hooks'; + +import { networkEnvironment } from 'environment'; +const { defaultDaoConfig } = networkEnvironment; + +export function useDisputeHook(disputeId: number, resolver: string) { + const { getDispute, loading, data, error } = useLazyDisputeQuery(disputeId); + // TODO: + // if the proposal doesn't use aragon's court, there're 2 choices + // how we can get dispute information + // 1. aragon's subgraph or 2. fetching it from court's contract directly. + // Since custom resolver that proposal might be using + // mighn't have `getDispute` and `getDisputeManager`, for simplicity, let's use aragon's + // court subgraph. + const isDefaultCourt = defaultDaoConfig.resolver.toLowerCase() === resolver.toLowerCase(); + + useEffect(() => { + if (isDefaultCourt) { + getDispute(); + } + }, [getDispute, isDefaultCourt]); + + return { + error, + loading, + data, + isDefaultCourt, + }; +} diff --git a/packages/govern-console/src/hooks/proposal-hooks.tsx b/packages/govern-console/src/hooks/proposal-hooks.tsx new file mode 100644 index 000000000..f80923688 --- /dev/null +++ b/packages/govern-console/src/hooks/proposal-hooks.tsx @@ -0,0 +1,25 @@ +import { useWallet } from 'AugmentedWallet'; +import { useMemo } from 'react'; +import QueueApprovals from 'services/QueueApprovals'; +import FacadeProposal from 'services/Proposal'; + +import { Proposal, ProposalOptions } from '@aragon/govern'; + +export function useFacadeProposal(queue: string, resolver: string) { + const context: any = useWallet(); + const { account, provider } = context; + + // TODO: GIORGI + // The react use memo below gets called 4 times. The reason for this is + // `account` dependency changes 4 times after clicking connect button on the UI. + // this should be called 1 time only. + const proposalInstance = useMemo(() => { + if (provider && account && queue && resolver) { + const queueApprovals = new QueueApprovals(account, queue, resolver); + const proposal = new Proposal(queue, {} as ProposalOptions); + return new FacadeProposal(queueApprovals, proposal) as FacadeProposal & Proposal; + } + }, [provider, account, queue, resolver]); + + return proposalInstance; +} diff --git a/packages/govern-console/src/hooks/query-hooks.tsx b/packages/govern-console/src/hooks/query-hooks.tsx new file mode 100644 index 000000000..0b3fb0c58 --- /dev/null +++ b/packages/govern-console/src/hooks/query-hooks.tsx @@ -0,0 +1,107 @@ +import { useState, useMemo } from 'react'; +import { useQuery, useLazyQuery } from '@apollo/client'; +import { DAO_BY_NAME, DAO_LIST, GOVERN_REGISTRY } from 'queries/dao'; +import { PROPOSAL_DETAILS, PROPOSAL_LIST } from 'queries/proposals'; +import { DISPUTE } from 'queries/court'; +import { courtClient } from 'index'; + +import { + transformProposalDetails, + transformProposals, + transformDaoDetails, +} from 'utils/transforms'; + +const POLL_INTERVAL = 5000; + +export function useDaoQuery(daoName: string) { + const { data, loading, error, refetch } = useQuery(DAO_BY_NAME, { + variables: { name: daoName }, + }); + + const daoData = useMemo(() => { + if (data) { + return transformDaoDetails(data); + } + return null; + }, [data]); + + return { + data: daoData, + loading: loading, + error, + refetch, + }; +} + +export function useDaosQuery() { + const { data, fetchMore, loading, error } = useQuery(DAO_LIST, { + variables: { + offset: 0, + limit: 12, + }, + }); + + return { data, loading, error, fetchMore }; +} + +export function useGovernRegistryQuery() { + const { data, loading, error } = useQuery(GOVERN_REGISTRY); + + return { + data, + loading, + error, + }; +} + +export function useLazyProposalQuery() { + const [proposalData, setProposalData] = useState(null); + + const [getProposalData, { loading }] = useLazyQuery(PROPOSAL_DETAILS, { + fetchPolicy: 'cache-and-network', + notifyOnNetworkStatusChange: true, + pollInterval: POLL_INTERVAL, + onCompleted: (newData) => { + const transformedData = transformProposalDetails(newData); + setProposalData(transformedData); + }, + }); + + return { getProposalData, loading, data: proposalData }; +} + +export function useLazyProposalListQuery() { + // const [proposalList, setProposalList] = useState(null); + const [getQueueData, { loading, data, error, fetchMore }] = useLazyQuery(PROPOSAL_LIST); + + // onCompleted doesn't work with lazyQuery when clicked on `fetchMore`. + // https://github.com/apollographql/apollo-client/issues/6636 + const proposalList = useMemo(() => { + if (data) { + return transformProposals(data); + } + }, [data]); + + return { + getQueueData, + fetchMore: fetchMore, + loading, + data: proposalList, + error, + }; +} + +export function useLazyDisputeQuery(disputId: number) { + const [getDispute, { loading, error, data }] = useLazyQuery(DISPUTE, { + notifyOnNetworkStatusChange: true, + variables: { id: disputId }, + client: courtClient, + }); + + return { + getDispute, + data, + loading, + error, + }; +} diff --git a/packages/govern-console/src/images/aragon-graphic-only-icon.svg b/packages/govern-console/src/images/aragon-graphic-only-icon.svg new file mode 100644 index 000000000..2ca96d258 --- /dev/null +++ b/packages/govern-console/src/images/aragon-graphic-only-icon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/aragon-icon.zip b/packages/govern-console/src/images/aragon-icon.zip new file mode 100644 index 0000000000000000000000000000000000000000..9cfaf0f6c8a857c1a394c391bd1ce9d44dc3ff15 GIT binary patch literal 1218 zcmWIWW@h1HU|`^2cv{gDG;MP1v_H%Y43jw-7>t0T?)hb@MR^L&`FX|pIjIUB`MIh3 zk*UQBE{^^Rp2g}TYx?yvp5AZBMrn|5AHQ(u*cMj)$z5M#^o_P5~(?j>a zd$xQ2@x|t|-_~4||Dg6`!C97X+dd!O8|^o{U-OqhQQ?_=BAvPhfx3OGmY+G9d9c#A zZ_;v&t1BzcY4sgBzM^p16X%qoIkju2M5WGOvV`&Rfp^_gUhJq)RXRM=+c0KP!RlAZ z2kgS-i$j-lesd}m`cT_jwm&F9J*93+*yeuIFm=KE6Q2Y%*#2n$zDVa?*ZJrB+0^GX z7xNtvSaSF9s@Z0Dlegc~na=TX)&02lkq0CUmjuL~u?wCT_)WwmMkGG#l&<>+QL{5U zyME5KSk?WiIiRqkU*$;aBKZ^aF0y+CzR_?Wb)r zj<*?~d0d=yuKkMFr$}MzH6d?g;snEYi?5m_eDJT$9&R0*=Gn6z*cu!SNf+Gd*6MRx zpzEB{3y~)Z?_9%Xxn{&X`0i2Hwv;1?{kG)089SGFn9k_@kYBd)%Jcq${cS2@-Wt=Q z6S$Idir1N3m}qhAnhJB;)0`O^$HQ(2FMnvKeedAeHO-S;Caz21{?r+4CZl~SZo&g6 zwGx#jrh4sD*kTg~2>*Jj=Ewi<%Od(cP+H#VK z$Bd;{6jODssoz<|V={Tp`GuUTf^s2~uW#CY zH(7Ff-QBa(Yq#6&kUJG)QsUEXQT8uC;^O3;T?v!@W=9Bj1uL1o_Y1RI`BIYO z|LwE9@ORt4E$?%dz2Tp|cC&rH*zBupi=UKs$e;3+l#${y-@g4fU$Tyw{yk~)`R%7a z6cn9&nD23vJE&vFs)>>_9K&9i89AR`zw?s^f2t_gUyI#;_;0jM%gft0nJ0F_#+RPW zrx{K}PCB40`D4D}cfS+^8RqN%XPmA6ccD&Qdfypy*NdFJIR+0jt`%Rp*&=Z=rAMpp x=l{uRMOsR~&whD#b$)<1Ba;XN?$QKUpdbO#%a#CdRyL3Uj6j$Gq + + diff --git a/packages/govern-console/src/images/connected-user-icon.svg b/packages/govern-console/src/images/connected-user-icon.svg new file mode 100644 index 000000000..392130154 --- /dev/null +++ b/packages/govern-console/src/images/connected-user-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/govern-console/src/images/console-header.svg b/packages/govern-console/src/images/console-header.svg new file mode 100644 index 000000000..48ff9b122 --- /dev/null +++ b/packages/govern-console/src/images/console-header.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/dao-not-found.svg b/packages/govern-console/src/images/dao-not-found.svg new file mode 100644 index 000000000..f4a036d7f --- /dev/null +++ b/packages/govern-console/src/images/dao-not-found.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/ds/help-icon.svg b/packages/govern-console/src/images/ds/help-icon.svg new file mode 100644 index 000000000..40ab45aeb --- /dev/null +++ b/packages/govern-console/src/images/ds/help-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/govern-console/src/images/ds/remove-option.svg b/packages/govern-console/src/images/ds/remove-option.svg new file mode 100644 index 000000000..e1f4c54e2 --- /dev/null +++ b/packages/govern-console/src/images/ds/remove-option.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/govern-console/src/images/pngs/create_dao@2x.png b/packages/govern-console/src/images/pngs/create_dao@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e037ee6949bf81c5bf1d91ce99fe5d5697fe34 GIT binary patch literal 73467 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 literal 0 HcmV?d00001 diff --git a/packages/govern-console/src/images/pngs/dao_setting_@2x.png b/packages/govern-console/src/images/pngs/dao_setting_@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8236d6196901f0f5acc47e17f6eae9d2557bb7a GIT binary patch literal 45541 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≀cKb)U^sRNgjpy&6YdAd8aZjx!00 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 hF&HkwDXhX* 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

@q5qgYBo3_pYG6 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 literal 0 HcmV?d00001 diff --git a/packages/govern-console/src/images/pngs/help_face_@2x.png b/packages/govern-console/src/images/pngs/help_face_@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..13527ea83d7a09d8902c58f18b2f99bef441ea0b GIT binary patch literal 69083 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

v%srs;H>T3w7=5BywE&DRC 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 FV1i1^+lBxD literal 0 HcmV?d00001 diff --git a/packages/govern-console/src/images/pngs/review_create_dao@2x.png b/packages/govern-console/src/images/pngs/review_create_dao@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..32848ed69db4140c30aeb82a5d47c4593d4f1f66 GIT binary patch literal 35608 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 y)xIIK+AdN;zu{bbX!na + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/Blue_tick.svg b/packages/govern-console/src/images/svgs/Blue_tick.svg new file mode 100644 index 000000000..7b0fbc806 --- /dev/null +++ b/packages/govern-console/src/images/svgs/Blue_tick.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/govern-console/src/images/svgs/CreateDao.svg b/packages/govern-console/src/images/svgs/CreateDao.svg new file mode 100644 index 000000000..537b7bd05 --- /dev/null +++ b/packages/govern-console/src/images/svgs/CreateDao.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/CreateDaoInProgress.svg b/packages/govern-console/src/images/svgs/CreateDaoInProgress.svg new file mode 100644 index 000000000..7cf00d9a3 --- /dev/null +++ b/packages/govern-console/src/images/svgs/CreateDaoInProgress.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/DefaultImageAddress.svg b/packages/govern-console/src/images/svgs/DefaultImageAddress.svg new file mode 100644 index 000000000..8598ce323 --- /dev/null +++ b/packages/govern-console/src/images/svgs/DefaultImageAddress.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/Setting_Icon.svg b/packages/govern-console/src/images/svgs/Setting_Icon.svg new file mode 100644 index 000000000..60e47ad33 --- /dev/null +++ b/packages/govern-console/src/images/svgs/Setting_Icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/govern-console/src/images/svgs/aragon-icon.svg b/packages/govern-console/src/images/svgs/aragon-icon.svg new file mode 100644 index 000000000..c0055eec8 --- /dev/null +++ b/packages/govern-console/src/images/svgs/aragon-icon.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/check_box_checked.svg b/packages/govern-console/src/images/svgs/check_box_checked.svg new file mode 100644 index 000000000..d273ed3da --- /dev/null +++ b/packages/govern-console/src/images/svgs/check_box_checked.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/check_box_unchecked.svg b/packages/govern-console/src/images/svgs/check_box_unchecked.svg new file mode 100644 index 000000000..b76008f05 --- /dev/null +++ b/packages/govern-console/src/images/svgs/check_box_unchecked.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/cross.svg b/packages/govern-console/src/images/svgs/cross.svg new file mode 100644 index 000000000..2d61f2f84 --- /dev/null +++ b/packages/govern-console/src/images/svgs/cross.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/govern-console/src/images/svgs/discord.svg b/packages/govern-console/src/images/svgs/discord.svg new file mode 100644 index 000000000..67499a385 --- /dev/null +++ b/packages/govern-console/src/images/svgs/discord.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/green_tick.svg b/packages/govern-console/src/images/svgs/green_tick.svg new file mode 100644 index 000000000..a2929a535 --- /dev/null +++ b/packages/govern-console/src/images/svgs/green_tick.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/govern-console/src/images/svgs/message.svg b/packages/govern-console/src/images/svgs/message.svg new file mode 100644 index 000000000..01c30cdff --- /dev/null +++ b/packages/govern-console/src/images/svgs/message.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/telegrama.svg b/packages/govern-console/src/images/svgs/telegrama.svg new file mode 100644 index 000000000..e800afe37 --- /dev/null +++ b/packages/govern-console/src/images/svgs/telegrama.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/govern-console/src/images/svgs/twitter.svg b/packages/govern-console/src/images/svgs/twitter.svg new file mode 100644 index 000000000..04e692df8 --- /dev/null +++ b/packages/govern-console/src/images/svgs/twitter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/govern-console/src/images/svgs/youtube.svg b/packages/govern-console/src/images/svgs/youtube.svg new file mode 100644 index 000000000..9bb5571b9 --- /dev/null +++ b/packages/govern-console/src/images/svgs/youtube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/govern-console/src/index.css b/packages/govern-console/src/index.css index 26c7a48a8..97f870082 100644 --- a/packages/govern-console/src/index.css +++ b/packages/govern-console/src/index.css @@ -1,5 +1,14 @@ +@import-normalize; + body { margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', + 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + background: #f6f9fc; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } diff --git a/packages/govern-console/src/index.tsx b/packages/govern-console/src/index.tsx index 72dff065e..88dfb0352 100644 --- a/packages/govern-console/src/index.tsx +++ b/packages/govern-console/src/index.tsx @@ -1,56 +1,71 @@ -import React from 'react' -import { render } from 'react-dom' -import { HashRouter } from 'react-router-dom' -import { QueryCache, ReactQueryCacheProvider } from 'react-query' -import { createGlobalStyle } from 'styled-components' -import 'styled-components/macro' -import App from './App' -import GeneralProvider from './Providers/GeneralProvider' - -const queryCache = new QueryCache() - -const GlobalStyle = createGlobalStyle` - *, *:before, *:after { - box-sizing: border-box; - } - html { - -webkit-overflow-scrolling: touch; - } - body { - height: 0; - min-height: 100vh; - background: black; - color: white; - font-family: 'Roboto Mono', Helvetica, sans-serif; - } - body, ul, p, h1, h2, h3, h4, h5, h6 { - margin: 0; - padding: 0; - } - button, select, input, textarea, h1, h2, h3, h4, h5, h6 { - font-size: inherit; - font-family: inherit; - font-weight: inherit; - line-height: inherit; - } - a, button, select, input, textarea { - color: inherit; - } - strong, b { - font-weight: 600; - } -` - -render( - - - - - +import React from 'react'; +import ReactDOM from 'react-dom'; +import MomentUtils from '@date-io/moment'; +import { MuiPickersUtilsProvider } from '@material-ui/pickers'; +import { ThemeProvider } from '@material-ui/core/styles'; +import { ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client'; +// import { offsetLimitPagination } from '@apollo/client/utilities'; + +import App from './App'; +import reportWebVitals from './reportWebVitals'; +import { lightTheme } from './AragonTheme'; +import './index.css'; + +import { networkEnvironment } from './environment'; + +const { subgraphUrl, courtSubgraphUrl } = networkEnvironment; + +function mergeFunction(existing: [], incoming: []) { + if (!incoming) return existing; + if (!existing) return incoming; + return [...existing, ...incoming]; +} + +export const courtClient = new ApolloClient({ + uri: courtSubgraphUrl, + cache: new InMemoryCache({}), +}); + +const client = new ApolloClient({ + uri: subgraphUrl, + cache: new InMemoryCache({ + typePolicies: { + GovernQueue: { + fields: { + containers: { + keyArgs: false, + merge: mergeFunction, + }, + }, + }, + Query: { + fields: { + daos: { + keyArgs: ['where', ['name']], + merge: mergeFunction, + }, + }, + }, + }, + }), + connectToDevTools: true, +}); + +ReactDOM.render( + + + {/* for date picker https://material-ui-pickers.dev/getting-started/installation */} + + - - - - , + + + + , document.getElementById('root'), -) +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/packages/govern-console/src/ipfs.d.ts b/packages/govern-console/src/ipfs.d.ts deleted file mode 100644 index 3bd7444e7..000000000 --- a/packages/govern-console/src/ipfs.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'is-ipfs' diff --git a/packages/govern-console/src/lib/abi/GovernQueue.json b/packages/govern-console/src/lib/abi/GovernQueue.json deleted file mode 100644 index 914f4375a..000000000 --- a/packages/govern-console/src/lib/abi/GovernQueue.json +++ /dev/null @@ -1,1843 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_aclRoot", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "_initialConfig", - "type": "tuple" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "reason", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "resolverId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "indexed": false, - "internalType": "struct ERC3000Data.Collateral", - "name": "collateral", - "type": "tuple" - } - ], - "name": "Challenged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "indexed": false, - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "name": "Configured", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IArbitrator", - "name": "arbitrator", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "disputeId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "evidence", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bool", - "name": "finished", - "type": "bool" - } - ], - "name": "EvidenceSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - } - ], - "name": "Executed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes4", - "name": "role", - "type": "bytes4" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - } - ], - "name": "Frozen", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes4", - "name": "role", - "type": "bytes4" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "who", - "type": "address" - } - ], - "name": "Granted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "string", - "name": "key", - "type": "string" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes4", - "name": "sig", - "type": "bytes4" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "ReceivedCallback", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes4", - "name": "sig", - "type": "bytes4" - }, - { - "indexed": false, - "internalType": "bytes4", - "name": "magicNumber", - "type": "bytes4" - } - ], - "name": "RegisteredCallback", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "RegisteredStandard", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "Resolved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes4", - "name": "role", - "type": "bytes4" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "who", - "type": "address" - } - ], - "name": "Revoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "contract IArbitrator", - "name": "arbitrator", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "disputeId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "ruling", - "type": "uint256" - } - ], - "name": "Ruled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "indexed": false, - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "indexed": false, - "internalType": "struct ERC3000Data.Collateral", - "name": "collateral", - "type": "tuple" - } - ], - "name": "Scheduled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "actor", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "reason", - "type": "bytes" - } - ], - "name": "Vetoed", - "type": "event" - }, - { - "inputs": [], - "name": "ROOT_ROLE", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "enum ACLData.BulkOp", - "name": "op", - "type": "uint8" - }, - { - "internalType": "bytes4", - "name": "role", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "who", - "type": "address" - } - ], - "internalType": "struct ACLData.BulkItem[]", - "name": "items", - "type": "tuple[]" - } - ], - "name": "bulk", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "_reason", - "type": "bytes" - } - ], - "name": "challenge", - "outputs": [ - { - "internalType": "uint256", - "name": "disputeId", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "challengerCache", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "configHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "_config", - "type": "tuple" - } - ], - "name": "configure", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IArbitrator", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "disputeItemCache", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - } - ], - "name": "execute", - "outputs": [ - { - "internalType": "bytes32", - "name": "failureMap", - "type": "bytes32" - }, - { - "internalType": "bytes[]", - "name": "execResults", - "type": "bytes[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - } - ], - "name": "executeApproved", - "outputs": [ - { - "internalType": "bytes32", - "name": "failureMap", - "type": "bytes32" - }, - { - "internalType": "bytes[]", - "name": "execResults", - "type": "bytes[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_role", - "type": "bytes4" - } - ], - "name": "freeze", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_role", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "grant", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "name": "initBlocks", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_aclRoot", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "_initialConfig", - "type": "tuple" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_role", - "type": "bytes4" - } - ], - "name": "isFrozen", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "queue", - "outputs": [ - { - "internalType": "enum GovernQueueStateLib.State", - "name": "state", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "_disputeId", - "type": "uint256" - } - ], - "name": "resolve", - "outputs": [ - { - "internalType": "bytes32", - "name": "failureMap", - "type": "bytes32" - }, - { - "internalType": "bytes[]", - "name": "execResults", - "type": "bytes[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_role", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "_who", - "type": "address" - } - ], - "name": "revoke", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "roles", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_disputeId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ruling", - "type": "uint256" - } - ], - "name": "rule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - } - ], - "name": "schedule", - "outputs": [ - { - "internalType": "bytes32", - "name": "containerHash", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "executionTime", - "type": "uint256" - }, - { - "internalType": "address", - "name": "submitter", - "type": "address" - }, - { - "internalType": "contract ERC3000Executor", - "name": "executor", - "type": "address" - }, - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Action[]", - "name": "actions", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "allowFailuresMap", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Payload", - "name": "payload", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "executionDelay", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "scheduleDeposit", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct ERC3000Data.Collateral", - "name": "challengeDeposit", - "type": "tuple" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "rules", - "type": "bytes" - } - ], - "internalType": "struct ERC3000Data.Config", - "name": "config", - "type": "tuple" - } - ], - "internalType": "struct ERC3000Data.Container", - "name": "_container", - "type": "tuple" - } - ], - "name": "settleRejection", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - }, - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "name": "submitEvidence", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_containerHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "_reason", - "type": "bytes" - } - ], - "name": "veto", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/govern-console/src/lib/abi/erc20.json b/packages/govern-console/src/lib/abi/erc20.json deleted file mode 100644 index 8816acc4f..000000000 --- a/packages/govern-console/src/lib/abi/erc20.json +++ /dev/null @@ -1,175 +0,0 @@ -[ - { - "constant": false, - "inputs": [ - { - "name": "_spender", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_from", - "type": "address" - }, - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_who", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_owner", - "type": "address" - }, - { - "name": "_spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "from", - "type": "address" - }, - { - "indexed": true, - "name": "to", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - } -] diff --git a/packages/govern-console/src/lib/chain-id.ts b/packages/govern-console/src/lib/chain-id.ts deleted file mode 100644 index 760106fee..000000000 --- a/packages/govern-console/src/lib/chain-id.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { useCallback, useMemo } from 'react' -import { useHistory, useRouteMatch } from 'react-router-dom' -import { chainIdFromNetworkId, getNetworkId } from './web3-utils' -import env from '../environment' - -type ChainIdData = { - chainId: number - updateChainId: (chainId?: number) => void -} - -export function useChainId(): ChainIdData { - const history = useHistory() - const route = useRouteMatch('/:network') as { params: { network: string } } - const chainId = chainIdFromNetworkId(route?.params?.network ?? '') ?? -1 - - const updateChainId = useCallback( - (_chainId: number = env('CHAIN_ID')) => { - if (_chainId !== chainId) { - history.push(`/${getNetworkId(_chainId)}`) - } - }, - [chainId, history], - ) - - return useMemo(() => ({ chainId, updateChainId }), [chainId, updateChainId]) -} diff --git a/packages/govern-console/src/lib/known-chains.ts b/packages/govern-console/src/lib/known-chains.ts deleted file mode 100644 index f3764c5f1..000000000 --- a/packages/govern-console/src/lib/known-chains.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const RINKEBY = 4 -export const MAINNET = 1 diff --git a/packages/govern-console/src/lib/known-roles.ts b/packages/govern-console/src/lib/known-roles.ts deleted file mode 100644 index 611165af6..000000000 --- a/packages/govern-console/src/lib/known-roles.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const KNOWN_QUEUE_ROLES = new Map([ - ['0x977d8964', 'schedule'], - ['0x3a139c71', 'execute'], - ['0x70576158', 'challenge'], - ['0x72896761', 'configure'], - ['0xc04c87b8', 'veto'], - ['0x586df604', 'ROOT_ROLE'], -]) - -export const KNOWN_GOVERN_ROLES = new Map([['0xc2d85afc', 'exec']]) diff --git a/packages/govern-console/src/lib/routing.ts b/packages/govern-console/src/lib/routing.ts deleted file mode 100644 index 11ada3542..000000000 --- a/packages/govern-console/src/lib/routing.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useCallback } from 'react' -import { useHistory } from 'react-router-dom' -import { useChainId } from './chain-id' -import { getNetworkId } from './web3-utils' - -type RoutingData = { - goHome: () => void -} - -export function useRouting(): RoutingData { - const history = useHistory() - const { chainId } = useChainId() - - const goHome = useCallback(() => { - const path = `/${getNetworkId(chainId)}` - if (history.location.pathname !== path) { - history.push(path) - } - }, [chainId, history]) - - return { goHome } -} diff --git a/packages/govern-console/src/lib/web3-contracts.ts b/packages/govern-console/src/lib/web3-contracts.ts deleted file mode 100644 index 31179c464..000000000 --- a/packages/govern-console/src/lib/web3-contracts.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - Contract as EthersContract, - getDefaultProvider, - providers, - utils as EthersUtils, -} from 'ethers' -import { useChainId } from './chain-id' -import { useWallet } from '../Providers/Wallet' -import { getNetworkEthersName } from './web3-utils' - -export function useContract( - address: string, - abi: any[], - signer = true, -): EthersContract | null { - const { wallet } = useWallet() - const { chainId } = useChainId() - - const ethersProvider = wallet.ethereum - ? new providers.Web3Provider(wallet.ethereum) - : getDefaultProvider(getNetworkEthersName(chainId)) - - const ethersSignerProvider = - signer && - wallet.ethereum && - ethersProvider instanceof providers.Web3Provider - ? ethersProvider.getSigner() - : null - - return address && EthersUtils.isAddress(address) && ethersProvider && abi - ? new EthersContract(address, abi, ethersSignerProvider || ethersProvider) - : null -} diff --git a/packages/govern-console/src/lib/web3-utils.ts b/packages/govern-console/src/lib/web3-utils.ts deleted file mode 100644 index 8eb98540c..000000000 --- a/packages/govern-console/src/lib/web3-utils.ts +++ /dev/null @@ -1,131 +0,0 @@ -import env from '../environment' - -export const DEFAULT_LOCAL_CHAIN = 'private' -export const ETH_FAKE_ADDRESS = `0x${''.padEnd(40, '0')}` -export const ETH_ANY_ADDRESS = '0xffffffffffffffffffffffffffffffffffffffff' -export const ETH_EMPTY_HEX = '0x' - -/** - * Check address equality without checksums - * @param {string} first First address - * @param {string} second Second address - * @returns {boolean} Address equality - */ -export function addressesEqual(first: string, second: string): boolean { - first = first && first.toLowerCase() - second = second && second.toLowerCase() - return first === second -} - -// Identifiers representing networks. Useful for URLs for example. -// See getNetworkId() and chainIdFromNetworkId(). -const NETWORK_IDS = new Map([ - [1, 'mainnet'], - [4, 'rinkeby'], - [100, 'xdai'], -]) -export function getNetworkId(chainId: number): string | undefined { - return NETWORK_IDS.get(chainId) -} -export function chainIdFromNetworkId(networkId: string): number | undefined { - for (const [chainId, _networkId] of NETWORK_IDS.entries()) { - if (_networkId === networkId) { - return chainId - } - } - return undefined -} - -// An name describing a given network. Useful when displaying networks in UI. -export function getNetworkName(chainId: number): string { - if (chainId === 1) return 'mainnet' - if (chainId === 4) return 'rinkeby' - if (chainId === 100) return 'xDai' - return 'Unknown' -} - -// Network names as defined by Ethers.js. Used to interact with Ethers.js only. -export function getNetworkEthersName(chainId: number): string | undefined { - if (chainId === 1) return 'homestead' - if (chainId === 3) return 'ropsten' - if (chainId === 4) return 'rinkeby' - return undefined -} - -export function getNetworkNode( - chainId: number = env('CHAIN_ID'), -): string | undefined { - if (chainId === 1) return 'https://mainnet.eth.aragon.network/' - if (chainId === 4) return 'https://rinkeby.eth.aragon.network/' - return undefined -} - -type UseWalletConf = unknown -type UseWalletProvider = { - id: string - useWalletConf?: UseWalletConf -} -type UseWalletConnectors = { - [key: string]: UseWalletConf -} - -export function getUseWalletProviders(): UseWalletProvider[] { - const providers = [{ id: 'injected' }, { id: 'frame' }] as UseWalletProvider[] - - if (env('FORTMATIC_API_KEY')) { - providers.push({ - id: 'fortmatic', - useWalletConf: { apiKey: env('FORTMATIC_API_KEY') }, - }) - } - - if (env('PORTIS_DAPP_ID')) { - providers.push({ - id: 'portis', - useWalletConf: { dAppId: env('PORTIS_DAPP_ID') }, - }) - } - - return providers -} - -export function getUseWalletConnectors(): UseWalletConnectors { - return getUseWalletProviders().reduce( - (connectors, provider) => { - if (provider.useWalletConf) { - connectors[provider.id] = provider.useWalletConf - } - return connectors - }, - {}, - ) -} - -/** - * Shorten an Ethereum address. `charsLength` allows to change the number of - * characters on both sides of the ellipsis. - * - * Examples: - * shortenAddress('0x19731977931271') // 0x1973…1271 - * shortenAddress('0x19731977931271', 2) // 0x19…71 - * shortenAddress('0x197319') // 0x197319 (already short enough) - * - * @param {string} address The address to shorten - * @param {number} [charsLength=4] The number of characters to change on both sides of the ellipsis - * @returns {string} The shortened address - */ -export function shortenAddress(address: string, charsLength = 4): string { - const prefixLength = 2 // "0x" - if (!address) { - return '' - } - if (address.length < charsLength * 2 + prefixLength) { - return address - } - - return ( - address.slice(0, charsLength + prefixLength) + - '...' + - address.slice(-charsLength) - ) -} diff --git a/packages/govern-console/src/logo.svg b/packages/govern-console/src/logo.svg new file mode 100644 index 000000000..9dfc1c058 --- /dev/null +++ b/packages/govern-console/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/govern-console/src/pages/SelectDao.tsx b/packages/govern-console/src/pages/SelectDao.tsx deleted file mode 100644 index 846ce008d..000000000 --- a/packages/govern-console/src/pages/SelectDao.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React, { useCallback, useState } from 'react' -import { useHistory, useParams } from 'react-router-dom' -import 'styled-components/macro' -import Button from '../components/Button' - -export default function SelectDao(): JSX.Element { - const [daoName, setDaoName] = useState('') - const history = useHistory() - const { network }: any = useParams() - const handleChangeDaoAddress = useCallback(e => { - setDaoName(e.target.value) - }, []) - const handleGoToDao = useCallback(() => { - history.push(`/${network}/${daoName}`) - }, [daoName, history, network]) - - return ( - <> -

- - - - - ) -} diff --git a/packages/govern-console/src/pages/ViewDao.tsx b/packages/govern-console/src/pages/ViewDao.tsx deleted file mode 100644 index 8239b3cab..000000000 --- a/packages/govern-console/src/pages/ViewDao.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import React from 'react' -import { Route, Switch, useRouteMatch, useParams } from 'react-router-dom' -import { useQuery } from 'react-query' -import { gql, request } from 'graphql-request' -import 'styled-components/macro' -import NewAction from '../components/NewAction/NewAction' -import ViewAction from '../components/ViewAction/ViewAction' -import ViewDao from '../components/ViewDao/ViewDao' -import { useChainId } from '../lib/chain-id' -import env from '../environment' - -const DAO_QUERY = gql` - query DAOQuery($name: String) { - registryEntry(id: $name) { - name - executor { - address - roles { - selector - who - frozen - } - } - queue { - address - roles { - selector - who - frozen - } - queued { - id - state - payload { - nonce - executionTime - submitter - proof - actions { - id - to - value - data - } - executor { - address - } - } - config { - executionDelay - scheduleDeposit { - token - amount - } - challengeDeposit { - token - amount - } - resolver - rules - } - history { - ... on ContainerEventVeto { - reason - } - } - } - config { - executionDelay - scheduleDeposit { - token - amount - } - challengeDeposit { - token - amount - } - resolver - rules - } - } - } - } -` - -export default function DaoView(): JSX.Element { - const { chainId } = useChainId() - const { daoAddress }: any = useParams() - const { path } = useRouteMatch() - const { data, isLoading: loading, error } = useQuery( - // This is the key for retrieving the data from react-query's cache; - // originally we were using the same key for this DAO query, no matter - // which DAO, but having an unique (but reproducible) key per DAO lets - // us store data on the user browser and persist it while avoiding - // false "info" flashes on other DAOs due to key collisions - `DAO_DATA_${daoAddress}`, - async () => - request( - chainId === 4 - ? env('RINKEBY_SUBGRAPH_URL') - : env('MAINNET_SUBGRAPH_URL'), - DAO_QUERY, - { - name: daoAddress, - }, - ), - ) - - if (loading) { - return

Loading DAO data...

- } - - if (error) { - console.error(error) - return

Error fetching DAO data.

- } - - if (!data.registryEntry) { - return

DAO not found.

- } - - return ( - - - - - - - - - - - -

Route not found :(

-
-
- ) -} diff --git a/packages/govern-console/src/queries/court.tsx b/packages/govern-console/src/queries/court.tsx new file mode 100644 index 000000000..1feacea53 --- /dev/null +++ b/packages/govern-console/src/queries/court.tsx @@ -0,0 +1,10 @@ +import { gql } from '@apollo/client'; + +export const DISPUTE = gql` + query dispute($id: ID!) { + disputes(where: { id: $id }) { + id + finalRuling + } + } +`; diff --git a/packages/govern-console/src/queries/dao.tsx b/packages/govern-console/src/queries/dao.tsx new file mode 100644 index 000000000..e1d19f345 --- /dev/null +++ b/packages/govern-console/src/queries/dao.tsx @@ -0,0 +1,92 @@ +import { gql } from '@apollo/client'; + +export const DAO_BY_NAME = gql` + query DAO($name: String) { + daos(where: { name: $name }) { + id + name + queue { + id + address + nonce + config { + executionDelay + scheduleDeposit { + token + amount + decimals + symbol + name + } + challengeDeposit { + token + amount + decimals + symbol + name + } + resolver + rules + maxCalldataSize + } + } + executor { + id + address + } + token + registrant + minter + } + } +`; + +export const DAO_LIST = gql` + query DAOs($offset: Int, $limit: Int) { + daos(skip: $offset, first: $limit, orderBy: createdAt, orderDirection: desc) { + id + name + createdAt + queue { + id + address + nonce + config { + executionDelay + scheduleDeposit { + token + amount + decimals + symbol + name + } + challengeDeposit { + token + amount + decimals + symbol + name + } + resolver + rules + maxCalldataSize + } + } + executor { + id + address + } + token + registrant + } + } +`; + +export const GOVERN_REGISTRY = gql` + { + governRegistries(limit: 1) { + id + count + } + } +`; diff --git a/packages/govern-console/src/queries/proposals.tsx b/packages/govern-console/src/queries/proposals.tsx new file mode 100644 index 000000000..9001d16d9 --- /dev/null +++ b/packages/govern-console/src/queries/proposals.tsx @@ -0,0 +1,121 @@ +import { gql } from '@apollo/client'; + +export const PROPOSAL_LIST = gql` + query proposals($id: ID, $offset: Int, $limit: Int) { + governQueue(id: $id) { + id + address + nonce + containers(skip: $offset, first: $limit, orderBy: createdAt, orderDirection: desc) { + id + state + createdAt + payload { + id + executionTime + title + } + } + nonce + } + } +`; + +export const PROPOSAL_DETAILS = gql` + query proposalDetails($id: ID) { + container(id: $id) { + id + state + createdAt + queue { + id + roles { + id + selector + who + granted + frozen + } + } + config { + id + executionDelay + scheduleDeposit { + id + token + amount + decimals + symbol + name + } + challengeDeposit { + id + token + amount + decimals + symbol + name + } + resolver + rules + maxCalldataSize + } + payload { + id + nonce + executionTime + submitter + title + executor { + id + address + } + actions { + id + to + value + data + } + allowFailuresMap + proof + } + history { + id + createdAt + ... on ContainerEventChallenge { + id + disputeId + challenger + collateral { + id + token + amount + } + disputeId + reason + resolver + } + ... on ContainerEventSchedule { + id + collateral { + id + token + amount + } + } + ... on ContainerEventExecute { + id + execResults + } + ... on ContainerEventResolve { + id + approved + } + ... on ContainerEventVeto { + id + reason + } + } + } + } +`; diff --git a/packages/govern-console/src/reportWebVitals.ts b/packages/govern-console/src/reportWebVitals.ts new file mode 100644 index 000000000..49a2a16e0 --- /dev/null +++ b/packages/govern-console/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/packages/govern-console/src/services/Executor.ts b/packages/govern-console/src/services/Executor.ts new file mode 100644 index 000000000..afdea2c41 --- /dev/null +++ b/packages/govern-console/src/services/Executor.ts @@ -0,0 +1,93 @@ +import { CustomTransaction, CustomTransactionStatus, Account } from 'utils/types'; +import { Contract, Signer, BigNumberish } from 'ethers'; +import { erc20ApprovalTransaction } from 'utils/transactionHelper'; +import { Asset } from 'utils/Asset'; + +const EXECUTOR_ABI = [ + 'function deposit(address token, uint256 amount, string calldata reference) external payable', +]; + +/** + * The Govern Executor class with abstraction on deposit and withdrawal + * transaction generation + */ +export class Executor { + private readonly executor: Contract; + + constructor(executorAddress: string, signer: Signer) { + this.executor = new Contract(executorAddress, EXECUTOR_ABI, signer); + } + + /** + * build a single custom transaction for the given amount + * @param tokenContract token contract address + * @param amount transaction amount + * @param displayAmount display amount for transaction message + * @param symbol asset symbol + * @returns a custom transaction + */ + private buildApprovalForAmount( + tokenContract: Contract, + amount: BigNumberish, + displayAmount: string, + symbol: string, + ): CustomTransaction { + return { + tx: () => tokenContract.approve(this.executor.address, amount), + message: `Approve ${displayAmount} ${symbol} to be spent by ${this.executor.address}`, + status: CustomTransactionStatus.Pending, + }; + } + + /** + * build approval transactions for executor as the spender + * @param asset asset to build approval for + * @returns CustomTransaction[] + */ + private async buildApprovalTransactions(asset: Asset): Promise { + if (asset.isEth()) { + return []; + } + + try { + const signer = this.executor.signer; + const address = await signer.getAddress(); + const spender = this.executor.address; + const account: Account = { address, signer }; + + const approvalTransactions = await erc20ApprovalTransaction( + asset.address, + asset.amount, + spender, + account, + ); + + return approvalTransactions; + } catch (error) { + console.log('Error creating approval transactions', error); + throw new Error(error); + } + } + + /** + * build transactions needed to deposit asset + * @param asset asset to be deposited + * @param reference comment about the deposit + * @returns CustomTransaction[] transactions for depositing the asset + */ + public async deposit(asset: Asset, reference: string): Promise { + const value = asset.isEth() ? asset.amount : 0; + + // token allowance and approval + const approvalTransactions = await this.buildApprovalTransactions(asset); + + // add the deposit transaction + const depositTransaction: CustomTransaction = { + tx: () => this.executor.deposit(asset.address, asset.amount, reference, { value }), + message: `Deposit ${asset.displayAmount} ${asset.symbol}`, + status: CustomTransactionStatus.Pending, + }; + + return approvalTransactions.concat(depositTransaction); + } +} diff --git a/packages/govern-console/src/services/Proposal.tsx b/packages/govern-console/src/services/Proposal.tsx new file mode 100644 index 000000000..95ad3a888 --- /dev/null +++ b/packages/govern-console/src/services/Proposal.tsx @@ -0,0 +1,84 @@ +/* eslint-disable */ +import QueueApproval from './QueueApprovals'; +import { ProposalParams, Proposal, DaoConfig } from '@aragon/govern'; +import { CustomTransaction, CustomTransactionStatus } from 'utils/types'; +import { buildContainer, Payload } from 'utils/ERC3000'; + +export default class FacadeProposal { + constructor(private queueApproval: QueueApproval, private proposal: Proposal) { + // Copy proposal's functions into this class. + for (const func of Object.getOwnPropertyNames(this.proposal.constructor.prototype)) { + // make sure we don't override methods from proposal. + if (!Object.getOwnPropertyNames(this.constructor.prototype).includes(func)) { + // @ts-ignore + this[func] = this.proposal.constructor.prototype[func].bind(this.proposal); + } + } + } + + public async challenge(container: ProposalParams, reason: string) { + let txs: CustomTransaction[] = []; + try { + txs = await this.queueApproval.challengeApprovals(container.config.challengeDeposit); + } catch (err) { + throw err; + } + + const challengeTransaction: CustomTransaction = { + tx: () => { + return this.proposal.challenge(container, reason); + }, + message: 'Challenge execution', + status: CustomTransactionStatus.Pending, + }; + + txs = [...txs, challengeTransaction]; + + return txs; + } + + public async schedule(payload: Payload, config: DaoConfig) { + let txs: CustomTransaction[] = []; + try { + txs = await this.queueApproval.scheduleApprovals(config.scheduleDeposit); + } catch (error) { + throw error; + } + + const scheduleTransaction: CustomTransaction = { + tx: () => { + const container = buildContainer(payload, config); + return this.proposal.schedule(container); + }, + message: 'Schedule execution', + status: CustomTransactionStatus.Pending, + }; + + txs = [...txs, scheduleTransaction]; + return txs; + } + + public async execute(container: ProposalParams) { + const executeTransaction: CustomTransaction = { + tx: () => { + return this.proposal.execute(container); + }, + message: 'Execute', + status: CustomTransactionStatus.Pending, + }; + + return [executeTransaction]; + } + + public async resolve(container: ProposalParams, disputeId: number) { + const resolveTransaction: CustomTransaction = { + tx: () => { + return this.proposal.resolve(container, disputeId); + }, + message: 'Resolve disputed transaction', + status: CustomTransactionStatus.Pending, + }; + + return [resolveTransaction]; + } +} diff --git a/packages/govern-console/src/services/QueueApprovals.tsx b/packages/govern-console/src/services/QueueApprovals.tsx new file mode 100644 index 000000000..cd2a7db23 --- /dev/null +++ b/packages/govern-console/src/services/QueueApprovals.tsx @@ -0,0 +1,85 @@ +import { CourtABI } from 'abis/court'; +import { ethers } from 'ethers'; +import { TokenDeposit } from '@aragon/govern'; + +import { erc20ApprovalTransaction } from 'utils/transactionHelper'; +import { CustomTransaction } from 'utils/types'; +import { Account } from 'utils/types'; +import { toBigNum } from 'utils/lib'; + +export default class QueueApprovals { + constructor(private account: Account, private queue: string, private resolver: string) {} + + /** + * @param scheduleDepositToken token to approve + * @param scheduleDepositAmount how much to approve + * + * @returns {Promise} All the necessary approval transactions + */ + public async scheduleApprovals(tokenDeposit: TokenDeposit) { + let transactionsQueue: CustomTransaction[] = []; + try { + const approvalTransactions = await erc20ApprovalTransaction( + tokenDeposit.token, + tokenDeposit.amount, + this.queue, + this.account, + ); + transactionsQueue = [...transactionsQueue, ...approvalTransactions]; + } catch (error) { + throw new Error(error); + } + + return transactionsQueue; + } + + /** + * @param challengeDepositToken token to approve + * @param challengeDepositAmount how much to approve + * + * @returns {Promise} All the necessary approval transactions + */ + public async challengeApprovals(tokenDeposit: TokenDeposit) { + let transactionsQueue: CustomTransaction[] = []; + + const resolver = new ethers.Contract(this.resolver, CourtABI, this.account.signer); + const [, feeToken, feeAmount] = await resolver.getDisputeFees(); + + let approvalTransactions = []; + + try { + // if equal, we need to approve only one time... + if (feeToken.toLowerCase() === tokenDeposit.token.toLowerCase()) { + approvalTransactions = await erc20ApprovalTransaction( + feeToken, + toBigNum(tokenDeposit.amount).add(feeAmount), + this.queue, + this.account, + ); + return [...approvalTransactions]; + } + + // add approval transaction for the challenge deposit token + approvalTransactions = await erc20ApprovalTransaction( + tokenDeposit.token, + tokenDeposit.amount, + this.queue, + this.account, + ); + transactionsQueue = [...transactionsQueue, ...approvalTransactions]; + + // add approval transaction for the fee token from the aragon's court + approvalTransactions = await erc20ApprovalTransaction( + feeToken, + feeAmount, + this.queue, + this.account, + ); + transactionsQueue = [...transactionsQueue, ...approvalTransactions]; + + return transactionsQueue; + } catch (error) { + throw new Error(error); + } + } +} diff --git a/packages/govern-console/src/services/analytics.ts b/packages/govern-console/src/services/analytics.ts new file mode 100644 index 000000000..5c7f39d6e --- /dev/null +++ b/packages/govern-console/src/services/analytics.ts @@ -0,0 +1,85 @@ +enum MethodType { + PAGE, + IDENTIFY, + EVENT, +} + +// TODO: define tracked Events +export enum EventType { + WALLET_DISCONNECTED = 'wallet_disconnected', + DEPOSIT_ASSETS_ClICKED = 'deposit_assets_clicked', + DAO_CREATEBTN_CLICKED = 'dao_createBtn_clicked', + DAO_CREATED = 'dao_created', + DAO_CREATIONFAILED = 'dao_creationFailed', + NAVBAR_CREATEDAO_CLICKED = 'navbar_createDAO_clicked', +} + +/** + * This private method extracts the necessary method from the global window object. + * + * @param methodType Type of analyts to track + * @returns the corresponding analytics method + */ +function getAnalyticsMethod(methodType: MethodType) { + const windowAnalytics = (window as any).analytics; + if (!windowAnalytics) { + return; + } + if (methodType === MethodType.PAGE) return windowAnalytics.page; + if (methodType === MethodType.IDENTIFY) return windowAnalytics.identify; + if (methodType === MethodType.EVENT) return windowAnalytics.track; +} + +/** + * This method keeps track of certain events (like creation of proposals, etc.). + * + * @param eventName name of the event to be tracked + * @param data data relating to tracked event + * @returns void + */ +export function trackEvent(eventType: EventType, eventData: T) { + const trackerMethod = getAnalyticsMethod(MethodType.EVENT); + if (typeof trackerMethod !== 'function') { + return; + } + trackerMethod(eventType, eventData); +} + +/** + * Sends analytics informations about the pages visited. + * + * @param pathName (Dynamic) Path name as given by the nextjs router. + * @returns void + */ +export function trackPage(pathName: string) { + const trackerMethod = getAnalyticsMethod(MethodType.PAGE); + if (typeof trackerMethod !== 'function') { + return; + } + trackerMethod({ + path: pathName, + }); +} + +/** + * Sends analytics informations about the connected wallets. + * + * @param account Wallet address + * @param networkName Name of the ethereum network the wallet is connected to + * @param connector Wallet connector used by use-wallet library + * @returns void + */ +export function identifyUser(account: string, networkName: string, connector: string) { + const trackerMethod = getAnalyticsMethod(MethodType.IDENTIFY); + if (typeof trackerMethod !== 'function') { + return; + } + + const walletData = { + wallet_address: account, + wallet_provider: connector, + network: networkName, + }; + + trackerMethod(walletData); +} diff --git a/packages/govern-console/src/setupTests.ts b/packages/govern-console/src/setupTests.ts new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/packages/govern-console/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/packages/govern-console/src/styled.d.ts b/packages/govern-console/src/styled.d.ts deleted file mode 100644 index 4604ed391..000000000 --- a/packages/govern-console/src/styled.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CSSObject, CSSProp } from 'styled-components' - -declare module 'react' { - interface Attributes { - css?: CSSProp | CSSObject - } -} diff --git a/packages/govern-console/src/styles.ts b/packages/govern-console/src/styles.ts new file mode 100644 index 000000000..84a9e41ef --- /dev/null +++ b/packages/govern-console/src/styles.ts @@ -0,0 +1,9 @@ +import { styled } from '@material-ui/core/styles'; + +export const BackButton = styled('div')({ + height: 25, + width: 62, + cursor: 'pointer', + position: 'relative', + left: 0, +}); diff --git a/packages/govern-console/src/utils/AbiFetcher.tsx b/packages/govern-console/src/utils/AbiFetcher.tsx new file mode 100644 index 000000000..2f2421340 --- /dev/null +++ b/packages/govern-console/src/utils/AbiFetcher.tsx @@ -0,0 +1,42 @@ +import { ETHERSCAN_API_KEY } from './constants'; +import { validateAbi } from './validations'; + +export default class AbiFetcher { + private readonly network: string; + + constructor(networkName: string) { + this.network = networkName.toLowerCase(); + } + + private getBaseUrl(): string { + return `https://api${ + this.network === 'mainnet' ? '' : `-${this.network}` + }.etherscan.io/api?apikey=${ETHERSCAN_API_KEY}`; + } + + async get(address: string): Promise { + const endpoint = `${this.getBaseUrl()}&module=contract&action=getabi&address=${address}`; + + try { + const response = await fetch(endpoint, { + method: 'GET', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + }); + + if (response.ok) { + const json = await response.json(); + if (json.message === 'OK') { + if (validateAbi(json.result) === true) { + return json.result; + } + } + } + } catch (e) { + // swallow error + } + return null; + } +} diff --git a/packages/govern-console/src/utils/AbiHandler.tsx b/packages/govern-console/src/utils/AbiHandler.tsx new file mode 100644 index 000000000..b08192ae9 --- /dev/null +++ b/packages/govern-console/src/utils/AbiHandler.tsx @@ -0,0 +1,225 @@ +import { utils, BigNumber } from 'ethers'; +import { ETHERSCAN_API_KEY } from './constants'; +import { ActionItem } from 'utils/types'; +import { ActionType } from '@aragon/govern'; + +// TODO: discuss with Giorgi to move this to a standalone library so that +// this module can be shared by Court as it's currently a duplicate of +// https://github.com/aragon/protocol-dashboard/blob/develop/src/utils/abi-utils.js + +type DecodedData = { + functionName: string; + inputData: any; +}; + +const COMPLEX_TYPES = new Set(['array', 'tuple']); + +/** + * Format number and BigNumber as string and return other values as is + * + * @param value the value to be decoded + * @returns + */ +function decodeValue(value: any): any { + if (typeof value === 'number' || BigNumber.isBigNumber(value)) { + return value.toString(); + } + if (Array.isArray(value)) { + return value.map(decodeValue); + } + return value; +} + +/** + * structures the decoded calldata in a concise way. + * + * @param {string} name the name of the element + * @param {object} input abi's component + * @param {any} value the actual parameter value user called + * @param {object} accum the final decoded result + * @returns {void} + */ +function decodeInput(name: string, input: any, value: any, accum: any) { + if (!accum[name]) accum[name] = {}; + + if (input.arrayChildren) { + accum[name] = {}; + value.map((item: any, index: number) => { + let key = `${index + 1}th element`; + if (input.arrayChildren) { + key += `(${input.arrayChildren.baseType})`; + } + accum[name][key] = {}; + decodeInput(key, input.arrayChildren, item, accum[name]); + }); + return; + } + + if (input.type === 'tuple') { + input.components.forEach((component: any, index: number) => { + decodeInput(`${component.name}(${component.baseType})`, component, value[index], accum[name]); + }); + return; + } + + accum[name] = decodeValue(value); +} + +/** + * AbiHandler class provides functions to retrieve ABI from etherscan + * and decode transaction data using ABI + */ +export default class AbiHandler { + private readonly network: string; + private readonly baseUrl: string; + private cache: Record; + + constructor(networkName: string) { + this.network = networkName.toLowerCase(); + this.baseUrl = `https://api${ + this.network === 'mainnet' ? '' : `-${this.network}` + }.etherscan.io/api?apikey=${ETHERSCAN_API_KEY}`; + this.cache = {}; + } + + /** + * Get the verified contract abi from etherscan + * + * @param address the contract address + * @returns {string|null} the contract abi + */ + async get(address: string): Promise { + if (this.cache[address]) { + return this.cache[address]; + } + + const endpoint = `${this.baseUrl}&module=contract&action=getabi&address=${address}`; + + try { + const response = await fetch(endpoint, { + method: 'GET', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + }); + + if (response.ok) { + const json = await response.json(); + if (json.message === 'OK') { + if (AbiHandler.isValidAbi(json.result) === true) { + this.cache[address] = json.result; + return json.result; + } + } + } + } catch (e) { + // swallow error + } + return null; + } + + /** + * Decode transaction data given the contract abi and transaction.data + * + * @param {string} abi contract abi + * @param {string} data encoded data + * @returns {DecodedData|null} decoded data + */ + static decode(abi: string, data: string): DecodedData | null { + try { + const iface = new utils.Interface(abi); + const sigHash = data.substring(0, 10); + const decodedData = iface.decodeFunctionData(sigHash, data); + const functionABI = iface.getFunction(sigHash); + + const functionName = functionABI.name; + const onlyNamedResult = decodedData.reduce((accum, value, index) => { + const input = functionABI.inputs[index]; + + decodeInput(`Argument #${index + 1} (${input.baseType})`, input, value, accum); + + return accum; + }, {}); + + return { functionName, inputData: onlyNamedResult }; + } catch (err) { + console.log(err, 'err'); + } + return null; + } + + /** + * Check if the given abi is in valid abi format + * + * @param {string} abi contract abi + * @returns {true|false} true if the abi is of valid format + */ + static isValidAbi(abi: string): boolean { + try { + const parsedAbi = JSON.parse(abi); + if (Array.isArray(parsedAbi) && parsedAbi.length > 0) { + return true; + } + } catch (e) {} + + return false; + } + + /** + * map an array of values (if not provided, use empty string) to ActionItem format + * + * @param {string} signature function signature from abi + * @param {string} contractAddress contract address + * @param {array} values to be encoded into action + * @returns + */ + static mapToAction(signature: string, contractAddress: string, values: any): ActionItem { + const fragment = utils.Fragment.from(signature) as utils.FunctionFragment; + const abiInterface = new utils.Interface([`${signature}`]); + const inputs = fragment.inputs.map((item, i) => ({ + name: item.name, + type: item.format(utils.FormatTypes.full), + baseType: item.baseType, + value: values && values[i] ? values[i] : '', + })); + const sighash = abiInterface.getSighash(fragment); + const action: ActionItem = { + sighash, + signature, + contractAddress, + name: fragment.name, + inputs, + payable: fragment.payable, + payableAmount: '', + }; + + return action; + } + + /** + * Encode action data to be passed to the Govern Queue for scheduling + * @param actions data to be encoded + * @returns ActionType[] array of actions with encoded calldata + */ + static encodeActions(actions: ActionItem[]): ActionType[] { + const encodedActions = actions.map((item) => { + const { sighash, signature, contractAddress, inputs = [] } = item; + const abiInterface = new utils.Interface([`${signature}`]); + const functionParameters = inputs.map((input) => { + return COMPLEX_TYPES.has(input.baseType) ? JSON.parse(input.value) : input.value; + }); + + const payableAmount = item.payable && item.payableAmount ? item.payableAmount : '0'; + const calldata = abiInterface.encodeFunctionData(sighash, functionParameters); + const data: ActionType = { + to: contractAddress, + value: utils.parseEther(payableAmount), + data: calldata, + }; + return data; + }); + + return encodedActions; + } +} diff --git a/packages/govern-console/src/utils/Asset.ts b/packages/govern-console/src/utils/Asset.ts new file mode 100644 index 000000000..34656eb7f --- /dev/null +++ b/packages/govern-console/src/utils/Asset.ts @@ -0,0 +1,96 @@ +import { BigNumber, providers } from 'ethers'; +import { TokenSymbol } from 'environment/types'; +import { constants, utils } from 'ethers'; +import { getTokenInfo } from 'utils/token'; +import { networkEnvironment } from 'environment'; +const { curatedTokens } = networkEnvironment; + +export const ETH = { + symbol: 'ETH', + decimals: 18, + address: constants.AddressZero, +}; + +export const OTHER_TOKEN_SYMBOL = 'Other...'; + +type AssetType = 'eth' | 'curated' | 'other'; + +export type AssetLabel = TokenSymbol | 'ETH' | 'Other...'; + +/** + * Asset class with helper functions + */ +export class Asset { + public amount: BigNumber; + + constructor( + public symbol: string = '', + public decimals: number = 0, + public address: string, + public displayAmount: string = '0', + public type: AssetType, + ) { + this.amount = utils.parseUnits(displayAmount, decimals); + } + + /** + * create an instance of asset from the given token contract address + * @param address token contract address + * @param displayAmount display amount (not the amount to be sent to the contract) + * @param provider for accesing token information + * @param assetType type of the asset, i.e. ETH, curated, or others.. + * @returns an instance of asset + */ + static async createFromAddress( + address: string, + displayAmount: string, + provider: providers.Web3Provider, + assetType: AssetType = 'other', + ) { + const { symbol, decimals } = await getTokenInfo(address, provider); + return new Asset(symbol || '', decimals || 0, address, displayAmount, assetType); + } + + /** + * create an instance of asset from the given label in the deposit/withdrawal drop down list + * @param label asset label in the dropdown list + * @param address token contract address + * @param displayAmount display amount (not the amount to be sent to the contract) + * @param provider for accesing token information + * @returns an instance of asset + */ + static async createFromDropdownLabel( + label: AssetLabel, + otherTokenAddress: string, + displayAmount: string, + provider: providers.Web3Provider, + ) { + if (label === ETH.symbol) { + return new Asset(ETH.symbol, ETH.decimals, ETH.address, displayAmount, 'eth'); + } + + const assetType: AssetType = Asset.isOtherToken(label) ? 'other' : 'curated'; + const assetAddress = Asset.isOtherToken(label) + ? otherTokenAddress + : curatedTokens[label as TokenSymbol]; + + return Asset.createFromAddress(assetAddress, displayAmount, provider, assetType); + } + + /** + * Is this ETH? + * @returns boolean - true for ETH, false for not ETH + */ + isEth() { + return this.type === 'eth'; + } + + /** + * Is this 'Other...' token from the drop down list + * @param label drop down list item label + * @returns true for Other token, false otherwise + */ + static isOtherToken(label: AssetLabel) { + return label === OTHER_TOKEN_SYMBOL; + } +} diff --git a/packages/govern-console/src/utils/ERC3000.tsx b/packages/govern-console/src/utils/ERC3000.tsx new file mode 100644 index 000000000..591981f1b --- /dev/null +++ b/packages/govern-console/src/utils/ERC3000.tsx @@ -0,0 +1,82 @@ +import { toUtf8Bytes } from '@ethersproject/strings'; +import { ethers } from 'ethers'; +import { DaoConfig, ProposalParams, PayloadType } from '@aragon/govern'; + +// below types ensure that some of the properties on payload +// ('executionTime' | 'allowFailuresMap' | "proof") are optional +// and other ones stay as required. https://github.com/Microsoft/TypeScript/issues/25760 +// and proof property if it exists must be a string + +type Omit = Pick>; +type WithOptional = Omit & Partial>; + +type optionalPayload = WithOptional; +export interface Payload extends optionalPayload { + proof: string; +} + +// NOTE: configData comes directly from a subgraph, which may contain +// more fields than Govern's DaoConfig can handle. +// so we build it manually. +export const buildConfig = (configData: any): DaoConfig => { + const config: DaoConfig = { + executionDelay: configData.executionDelay, + scheduleDeposit: { + token: configData.scheduleDeposit.token, + amount: configData.scheduleDeposit.amount, + }, + challengeDeposit: { + token: configData.challengeDeposit.token, + amount: configData.challengeDeposit.amount, + }, + maxCalldataSize: configData.maxCalldataSize, + resolver: configData.resolver, + rules: configData.rules, + }; + return config; +}; + +// NOTE: ProposalInfo comes directly from a subgraph, which may contain +// more fields than Govern's PayloadType and DaoConfig can handle. +// so we build both of them manually. +export const getProposalParams = (proposalInfo: any) => { + const config = buildConfig(proposalInfo.config); + + const payload: PayloadType = { + actions: proposalInfo.payload.actions, + executor: proposalInfo.payload.executor.address, + proof: proposalInfo.payload.proof, + submitter: proposalInfo.payload.submitter, + allowFailuresMap: proposalInfo.payload.allowFailuresMap, + executionTime: proposalInfo.payload.executionTime, + nonce: proposalInfo.payload.nonce, + }; + + const params: ProposalParams = { + payload, + config, + }; + return params; +}; + +export const buildContainer = (payload: Payload, config: DaoConfig): ProposalParams => { + // buildContainer should be called right before proposal.schedule() to minimize hitting contract asssertion + // `require(executionTime > executionDelay + block.timestamp)` where executionTime becomes stale and invalid + const containerPayload: PayloadType = { + executionTime: + payload.executionTime || + Math.round(Date.now() / 1000) + parseInt(config.executionDelay.toString()) + 150, // add 150 seconds for network latency. + submitter: payload.submitter, + executor: payload.executor, + actions: payload.actions || [], + allowFailuresMap: payload.allowFailuresMap || ethers.utils.hexZeroPad('0x0', 32), + proof: payload.proof || toUtf8Bytes('0x'), + }; + + const container: ProposalParams = { + payload: containerPayload, + config: config, + }; + + return container; +}; diff --git a/packages/govern-console/src/utils/Error.ts b/packages/govern-console/src/utils/Error.ts new file mode 100644 index 000000000..9e592c45e --- /dev/null +++ b/packages/govern-console/src/utils/Error.ts @@ -0,0 +1,3 @@ +export const Error = { + ConnectAccount: 'Please connect your account', +}; diff --git a/packages/govern-console/src/utils/HelpText.tsx b/packages/govern-console/src/utils/HelpText.tsx new file mode 100644 index 000000000..ae2f0ef28 --- /dev/null +++ b/packages/govern-console/src/utils/HelpText.tsx @@ -0,0 +1,88 @@ +import { ReactNode } from 'react'; +import { Link } from '@aragon/ui'; + +export enum PageName { + NEW_EXECUTION = 'NEW_EXECUTION', + CREATE_DAO = 'CREATE_DAO', + CREATE_DAO_CONFIG = 'CREATE_DAO_CONFIG', + CREATE_DAO_COLLATERAL = 'CREATE_DAO_COLLATERAL', +} + +const TRANSACTION_TIP = (index: number) => [ + 'What is a transaction?', +
+ A transaction is any movement of funds within or from your DAO or any change of settings. +
, +]; + +const REASONS_TIP = (index: number) => [ + 'Why do I need to justify when scheduling a transaction?', +
+ DAO members may challenge any transaction contrary to the DAO Agreement. Therefore, you must + explain how this transaction is compatible with the Agreement. +
, +]; + +const WHATS_DAO_TIP = (index: number) => [ + 'What’s a DAO?', +
+ A DAO is a self-organizing online community that uses distributed ledger technology (DLT) like + Ethereum to manage its funds securely. You can read more about them{' '} + here. +
, +]; + +const DAO_FREE_TIP = (index: number) => [ + 'Is a DAO free?', +
+ DAOs are permissionless, meaning anyone can set one up, but operations on the DL such as + creating the DAO or sending transactions do incur a 'gas' fee. +
, +]; + +const WHAT_TO_DO_DAO_TIP = (index: number) => [ + 'What can I do with my DAO?', +
+ Build any organization you can dream of!{' '} + + Here are a few ideas + + . +
, +]; + +const EXECUTION_DELAY_TIP = (index: number) => [ + 'What is execution delay?', +
+ The execution delay is the minimum time any transaction that is scheduled in your DAO can’t be + executed. This delay enables members to make sure the transaction is valid and conforms to your + agreement, and if not, can be disputed. After this cool down period, transaction will be + available for execution. +
, +]; + +const COLLATERALS_TIP = (index: number) => [ + 'Why do I need to define collaterals?', +
+ Collaterals on Govern DAOs are used to make sure members are cautious with their actions. If a + transaction is disputed, both the transaction creator and the challenger will be staking their + collaterals into a dispute, and can lose it if the dispute is ruled in favor of the other. +
, +]; + +const ADDRESS_LIST_TIP = (index: number) => [ + 'What is the address whitelist?', +
+ Aragon Govern enables decisions to be made faster, as long as members hold the collateral + tokens. If you want to add an extra layer of security you can also create a list of addresses + that are allowed to schedule transaction, so not only members need to hold the tokens, but also + be in this list. +
, +]; + +export const HelpText: Record> = { + [PageName.NEW_EXECUTION]: [TRANSACTION_TIP(0), REASONS_TIP(1)], + [PageName.CREATE_DAO]: [WHATS_DAO_TIP(0), DAO_FREE_TIP(1), WHAT_TO_DO_DAO_TIP(2)], + [PageName.CREATE_DAO_CONFIG]: [WHATS_DAO_TIP(0), EXECUTION_DELAY_TIP(0)], + [PageName.CREATE_DAO_COLLATERAL]: [WHATS_DAO_TIP(0), COLLATERALS_TIP(0), ADDRESS_LIST_TIP(1)], +}; diff --git a/packages/govern-console/src/utils/HelperFunctions.tsx b/packages/govern-console/src/utils/HelperFunctions.tsx new file mode 100644 index 000000000..8e7499dca --- /dev/null +++ b/packages/govern-console/src/utils/HelperFunctions.tsx @@ -0,0 +1,43 @@ +import { format } from 'date-fns'; + +export function getFormattedDate(date?: number | string) { + try { + if (!date) date = Date.now(); + if (typeof date === 'string') date = parseInt(date, 10) * 1000; + const formattedDate = format(date, 'MMM dd yyyy HH:mm', {}); + return formattedDate; + } catch (e) { + return date; + } +} + +export function isIPFShash(/*_value: string*/): boolean { + // check for value being an ipfs hash + return false; +} + +// export function getFormattedValue(value: string) { +// try { +// if (isIPFShash(value)) { +// return ( +// +// value +// +// ); +// } else return value; +// } catch (e) { +// return value; +// } +// } + +export function getErrorFromException(ex: any): string { + let errorMessage = ex.error?.message || ex.reason || ex.message; + if (!errorMessage) { + try { + errorMessage = JSON.stringify(ex); + } catch { + errorMessage = 'Unknown error'; + } + } + return errorMessage; +} diff --git a/packages/govern-console/src/utils/account.tsx b/packages/govern-console/src/utils/account.tsx new file mode 100644 index 000000000..307530ceb --- /dev/null +++ b/packages/govern-console/src/utils/account.tsx @@ -0,0 +1,4 @@ +export function getTruncatedAccountAddress(account: string | null) { + if (account === null) return ''; + return account.substring(0, 6) + '...' + account.substring(account.length - 4, account.length); +} diff --git a/packages/govern-console/src/utils/actions.tsx b/packages/govern-console/src/utils/actions.tsx new file mode 100644 index 000000000..10c24c0f5 --- /dev/null +++ b/packages/govern-console/src/utils/actions.tsx @@ -0,0 +1,8 @@ +export default { + APPROVE: 'APPROVE', + SCHEDULE: 'SCHEDULE', + CHALLENGE: 'CHALLENGE', + VETO: 'VETO', + RESOLVE: 'RESOLVE', + EXECUTE: 'EXECUTE', +}; diff --git a/packages/govern-console/src/utils/constants.tsx b/packages/govern-console/src/utils/constants.tsx new file mode 100644 index 000000000..d8243f437 --- /dev/null +++ b/packages/govern-console/src/utils/constants.tsx @@ -0,0 +1,9 @@ +export const CONFIRMATION_WAIT = 3; // we wait 3 confirmation to make sure subgraph is populated + +export const PROXY_CONTRACT_URL = 'https://eips.ethereum.org/EIPS/eip-1167'; + +export const INFURA_PROJECT_ID = '7a03fcb37be7479da06f92c5117afd47'; +export const ETHERSCAN_API_KEY = 'HS2AR94Q6G6RYIYHR7VRCZGP6E382K4BDC '; +export const IPFS_GATEWAY = 'https://ipfs.io/ipfs/'; +export const ARAGON_HELP_URL = 'https://help.aragon.org/'; +export const MAX_SCHEDULE_ACCESS_LIST_ALLOWED = 10; diff --git a/packages/govern-console/src/utils/date.tsx b/packages/govern-console/src/utils/date.tsx new file mode 100644 index 000000000..1e9bc9c62 --- /dev/null +++ b/packages/govern-console/src/utils/date.tsx @@ -0,0 +1,24 @@ +import { format } from 'date-fns'; + +export const toMs = (seconds: number) => seconds * 1000; + +const KNOWN_FORMATS = { + standard: 'MMM dd yyyy HH:mm', // This is our standard used for showing dates. +}; + +/** + * @param date number or string in seconds (not milliseconds) + * @param formatType KNOWN_FORMATS + */ +export function formatDate(date: number | string, formatType?: string) { + try { + if (typeof date === 'string') { + date = parseInt(date, 10); + } + date = date * 1000; + formatType = formatType || KNOWN_FORMATS.standard; + return format(date, formatType, {}); + } catch (e) { + return date; + } +} diff --git a/packages/govern-console/src/utils/ipfs.tsx b/packages/govern-console/src/utils/ipfs.tsx new file mode 100644 index 000000000..b85c0fe1d --- /dev/null +++ b/packages/govern-console/src/utils/ipfs.tsx @@ -0,0 +1,188 @@ +import CID from 'cids'; +import { toUTF8String } from 'utils/lib'; +import { IPFS_GATEWAY } from './constants'; +import { create } from 'ipfs-http-client'; +import { ipfsMetadata } from 'utils/types'; + +let ipfs: any = null; + +const FILE_EXTS = { + text: 'txt', +}; + +const MIME_TYPES = ['text/plain']; + +// Fleek IPFS That also handles pinning... +function createIpfs() { + if (!ipfs) { + ipfs = create({ + url: 'https://2a7143fae39e7adaeb57.b-cdn.net/api/v0', + headers: { + authorization: 'v2 z7fAEdRSjqiH7Qv8ez2Qs6gypd5v3YH8cPGEE9MyESMVb', + }, + }); + } +} + +export async function addToIpfs(data: HTMLInputElement | string, metadata: any = null) { + createIpfs(); + + const ipfsFilePath = `/aragon/blob${typeof data === 'string' ? '.' + FILE_EXTS.text : ''}`; + const ipfsMetadataPath = '/aragon/metadata.json'; + + if (metadata == null) { + const { cid } = await ipfs.add({ + path: ipfsFilePath, + content: data, + }); + const cidBytes = cid.toV1().bytes; + return cidBytes; + } + + const files = [ + { + path: ipfsFilePath, + content: data, + }, + { + path: ipfsMetadataPath, + content: JSON.stringify(metadata), + }, + ]; + + for await (const result of ipfs.addAll(files)) { + if (result.path === 'aragon') { + const cidBytes = result.cid.toV1().bytes; + return cidBytes; + } + } +} +/** + * checks with different combinations if the passed string is cid + * + * @param uriOrCid Cid or the complete uri of ipfs + * @returns {string|null} cid if it's the actual cid or null + */ +export function getIpfsCid(uriOrCid: string) { + const cidString = uriOrCid.replace(/^ipfs:/, ''); + + // if cidString can be passed to CID class without throwing + // it means it's the actual cid + try { + new CID(cidString); + return cidString; + } catch (err) {} + + // if cidString is ipfs v1 version hex from the cid's raw bytes and + // we add `f` as a multibase prefix and remove `0x` + try { + const cid = `f${cidString.substring(2)}`; + new CID(cid); + return cid; + } catch (err) {} + + // if cidString is ipfs v0 version hex from the cid's raw bytes, + // we add: + // 1. 112 (0x70 in hex) which is dag-pb format. + // 2. 01 because we want to use v1 version + // 3. f since cidString is already hex, we only add `f` without converting anything. + try { + const cid = `f0170${cidString.substring(2)}`; + new CID(cid); + return cid; + } catch (err) {} + + // if cidString is hex received from string-to-hex converter + try { + const cid = toUTF8String(cidString) || cidString; + // eslint-disable-next-line no-new + new CID(cid); + return cid; + } catch (err) {} + + return null; +} + +/** + * @param uriOrCid Cid or the complete uri of ipfs + * + * @returns {string} the gateway url of the cid + */ +export function getIpfsUrl(uriOrCid: string) { + let cid: string | null = uriOrCid.replace(/^ipfs:/, ''); + cid = getIpfsCid(cid); + return cid ? `${IPFS_GATEWAY}${cid}` : null; +} + +export async function fetchIPFS(uriOrCid: string) { + createIpfs(); + + let cid: string | null = uriOrCid.replace(/^ipfs:/, ''); + cid = getIpfsCid(cid); + if (!cid) { + return null; + } + + // endpoint/text can be array for supporting multiple files + const data: ipfsMetadata = { + metadata: null, + endpoint: null, + text: null, + error: null, + }; + + for await (const file of ipfs.get(cid)) { + // If the file type is dir, it's a directory, + // so we need inside files + if (file.type === 'dir') { + continue; + } + + if (file.type === 'file') { + const content: any = []; + + for await (const chunk of file.content) { + content.push(chunk); + } + + const buffer = Buffer.concat(content); + + if (file.path.includes('metadata')) { + try { + data.metadata = JSON.parse(new TextDecoder().decode(buffer)); + } catch (err) {} + } else { + data.endpoint = IPFS_GATEWAY + file.path; + + const extension = file.path.split('.').pop(); + // check if the extension exists and is of type `.txt` + // to get the text representation by saving bandwith. + if (Object.values(FILE_EXTS).includes(extension)) { + try { + data.text = new TextDecoder().decode(buffer); + } catch (err) {} + } + // if the path name doesn't have .txt extension + // or doesn't include path at all, fetch is needed + // to determine the type and gets its text if it's text/plain + else { + const response = await fetch(IPFS_GATEWAY + file.path); + if (!response.ok) { + data.error = !response.ok; + return data; + } + + const blob = await response.clone().blob(); + + if (MIME_TYPES.includes(blob.type)) { + try { + data.text = new TextDecoder().decode(buffer); + } catch (err) {} + } + } + } + } + } + + return data; +} diff --git a/packages/govern-console/src/utils/lib.tsx b/packages/govern-console/src/utils/lib.tsx new file mode 100644 index 000000000..9e253753a --- /dev/null +++ b/packages/govern-console/src/utils/lib.tsx @@ -0,0 +1,37 @@ +// Library utils (Ethers currently) +import { utils, BigNumberish, ethers } from 'ethers'; + +const { toUtf8String, toUtf8Bytes } = utils; + +export function toUTF8String(data: utils.BytesLike): string | null { + try { + return toUtf8String(data); + } catch (err) { + return null; // can't be decoded + } +} + +export function toUTF8Bytes(data: string): utils.BytesLike | null { + try { + return toUtf8Bytes(data); + } catch (err) { + return null; // can't be decoded + } +} + +// example: formatUnits(100, 3) = 0.1 +export function formatUnits(amount: BigNumberish, decimals: number) { + if (amount.toString().includes('.') || !decimals) { + return amount.toString(); + } + return ethers.utils.formatUnits(amount, decimals); +} + +// example: parseUnits(100, 3) = 100000 +export function parseUnits(amount: BigNumberish, decimals: number) { + return ethers.utils.parseUnits(amount.toString(), decimals); +} + +export function toBigNum(value: BigNumberish) { + return ethers.BigNumber.from(value); +} diff --git a/packages/govern-console/src/utils/radspec.tsx b/packages/govern-console/src/utils/radspec.tsx new file mode 100644 index 000000000..f8d08e217 --- /dev/null +++ b/packages/govern-console/src/utils/radspec.tsx @@ -0,0 +1,22 @@ +import actions from './actions'; + +export default { + [actions.APPROVE]: ({ amount }: { amount: number }) => { + return `Approves ${amount} ANT`; + }, + [actions.SCHEDULE]: () => { + return `Schedules a new Proposal`; + }, + [actions.CHALLENGE]: () => { + return `Challenges a new Proposal`; + }, + [actions.EXECUTE]: () => { + return `Executes a new Proposal`; + }, + [actions.RESOLVE]: () => { + return `Resolves a new Proposal`; + }, + [actions.VETO]: () => { + return `Vetos a new Proposal`; + }, +}; diff --git a/packages/govern-console/src/utils/scrollToId.tsx b/packages/govern-console/src/utils/scrollToId.tsx new file mode 100644 index 000000000..b1f226c93 --- /dev/null +++ b/packages/govern-console/src/utils/scrollToId.tsx @@ -0,0 +1,10 @@ +/** + * scrollToId allowes to scroll to any element of a page by id. + * @param {string} id - defaults to header id of the app header. + */ +const scrollToId = (id = 'header') => { + const element = document.getElementById(id); + element?.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'nearest' }); +}; + +export default scrollToId; diff --git a/packages/govern-console/src/utils/states.tsx b/packages/govern-console/src/utils/states.tsx new file mode 100644 index 000000000..1942339df --- /dev/null +++ b/packages/govern-console/src/utils/states.tsx @@ -0,0 +1,56 @@ +import { formatDate } from './date'; + +export const PROPOSAL_STATES = { + SCHEDULED: 'Scheduled', + CHALLENGED: 'Challenged', + EXECUTED: 'Executed', + APPROVED: 'Approved', + REJECTED: 'Rejected', + VETOED: 'Vetoed', + EXECUTABLE: 'Executable', +}; + +export const PROPOSAL_STATES_COLORS = { + [PROPOSAL_STATES.SCHEDULED]: 'grey', + [PROPOSAL_STATES.CHALLENGED]: 'orange', + [PROPOSAL_STATES.EXECUTED]: 'purple', + [PROPOSAL_STATES.APPROVED]: 'green', + [PROPOSAL_STATES.REJECTED]: 'red', + [PROPOSAL_STATES.VETOED]: 'black', + [PROPOSAL_STATES.EXECUTABLE]: 'lightBlue', +}; + +// NOTE: time is in seconds since epoch +export const eligibleExecution = (time: number | string) => { + // add 15 seconds latency due to ethereum's block.timestamp variance by 15 seconds. + // needed so that user doesn't click the button immediatelly once it's eligible which + // will cause the tx error due to `wait more` from the contract. + time = parseInt(time.toString(), 10); + time = time + 15; + return { + isEligible: Date.now() >= time * 1000, + eligibleDate: formatDate(time), + }; +}; + +export const getStateColor = (state: string, executionTime: number) => { + if (state == PROPOSAL_STATES.SCHEDULED && eligibleExecution(executionTime).isEligible) { + return PROPOSAL_STATES_COLORS[PROPOSAL_STATES.EXECUTABLE]; + } + + return PROPOSAL_STATES_COLORS[state]; +}; + +export const getState = (state: string, executionTime: number) => { + if (state == PROPOSAL_STATES.SCHEDULED && eligibleExecution(executionTime).isEligible) { + return 'Executable'; + } + if (state == PROPOSAL_STATES.APPROVED) { + return 'Ruled positively'; + } + if (state == PROPOSAL_STATES.REJECTED) { + return 'Ruled negatively'; + } + + return state; +}; diff --git a/packages/govern-console/src/utils/token.tsx b/packages/govern-console/src/utils/token.tsx new file mode 100644 index 000000000..498212157 --- /dev/null +++ b/packages/govern-console/src/utils/token.tsx @@ -0,0 +1,62 @@ +import { ethers, BigNumberish } from 'ethers'; +import { erc20TokenABI } from 'abis/erc20'; +import { formatUnits, parseUnits } from 'utils/lib'; + +export async function isTokenERC20(address: string, provider: any) { + const contract = new ethers.Contract(address, erc20TokenABI, provider); + try { + await Promise.all([contract.balanceOf(address), contract.totalSupply()]); + return true; + } catch (err) { + return false; + } +} + +export async function getTokenInfo(address: string, provider: any) { + const contract = new ethers.Contract(address, erc20TokenABI, provider); + let decimals = null, + name = null, + symbol = null; + + try { + decimals = await contract.decimals(); + } catch (err) {} + + try { + name = await contract.name(); + } catch (err) {} + + try { + symbol = await contract.symbol(); + } catch (err) {} + + return { + decimals, + name, + symbol, + }; +} + +/** + * @param address address of the token + * @param amount amount + * @param isFormat if true - appends, else cuts off decimal number 0's + * @param provider provider + * + * @returns {BigNumberish} amount + */ +export const correctDecimal = async ( + address: string, + amount: string | BigNumberish, + isFormat: boolean, + provider: any, +) => { + try { + const { decimals } = await getTokenInfo(address, provider); + if (!decimals) return amount; + + return isFormat ? parseUnits(amount.toString(), decimals) : formatUnits(amount, decimals); + } catch (err) { + return amount; + } +}; diff --git a/packages/govern-console/src/utils/transactionHelper.tsx b/packages/govern-console/src/utils/transactionHelper.tsx new file mode 100644 index 000000000..d1ad49209 --- /dev/null +++ b/packages/govern-console/src/utils/transactionHelper.tsx @@ -0,0 +1,78 @@ +import { CustomTransaction, CustomTransactionStatus } from 'utils/types'; +import { ethers, BigNumber } from 'ethers'; +import { erc20TokenABI } from 'abis/erc20'; +import { AddressZero } from '@ethersproject/constants'; +import { BigNumberish } from '@ethersproject/bignumber'; +import { Account } from 'utils/types'; +import { getTokenInfo } from 'utils/token'; +import { formatUnits } from 'utils/lib'; +import { toBigNum } from 'utils/lib'; + +/** + * @param token address of the token + * @param amount how much to approve + * @param spender spender + * @param account address and the signer + * + * @returns {Promise} + */ +export async function erc20ApprovalTransaction( + token: string, + amount: BigNumberish, + spender: string, + account: Account, +): Promise { + // if the token is zero address, it means there's no need for approval + if (token === AddressZero) { + return []; + } + + const amountInBigNumber: BigNumber = toBigNum(amount); + + const contract = new ethers.Contract(token, erc20TokenABI, account.signer); + + let allowance: BigNumber = toBigNum(0); + let userBalance: BigNumber = toBigNum(0); + let amountForHuman: string = amount.toString(); + + const tokenInfo = await getTokenInfo(token, account.signer); + const symbol = tokenInfo.symbol || 'tokens'; + const decimals = tokenInfo.decimals; + + if (decimals) { + amountForHuman = formatUnits(amount, decimals); + } + + try { + allowance = await contract.allowance(account.address, spender); + userBalance = await contract.balanceOf(account.address); + } catch (err) { + // contract address might not have `allowance` or balanceOf on it. + // TODO: track it with sentry + throw new Error(`Contract ${token} doesn't seem to be ERC20 compliant.`); + } + + // user balance is less than the amount that needs approval. + // this means user won't be able to approve full amount. + if (userBalance.lt(amountInBigNumber)) { + throw new Error(`You need ${amountForHuman} ${symbol} for this transaction.`); + } + + // user has enough balance, but also already got amountInBigNumber approved for spender + if (allowance.gte(amountInBigNumber)) { + return []; + } + + // approve amountInBigNumber for the spender + const transaction: CustomTransaction = { + tx: () => { + return contract.approve(spender, amountInBigNumber); + }, + message: `Approves ${amountForHuman} ${symbol} to be used by ${spender}`, + status: CustomTransactionStatus.Pending, + }; + + // we currently only return 1 transaction, though it might be needed that this function takes care + // of zero approval first and then the amount approval. + return [transaction]; +} diff --git a/packages/govern-console/src/utils/transforms.tsx b/packages/govern-console/src/utils/transforms.tsx new file mode 100644 index 000000000..5033cfaf9 --- /dev/null +++ b/packages/govern-console/src/utils/transforms.tsx @@ -0,0 +1,18 @@ +export function transformProposalDetails(data: any) { + return data; +} + +export function transformProposals(data: any) { + return data; +} + +export function transformDaoDetails(data: any) { + const daos = data.daos; + if (daos.length == 0) { + return null; + } + + data = daos[0]; + + return data; +} diff --git a/packages/govern-console/src/utils/types.tsx b/packages/govern-console/src/utils/types.tsx new file mode 100644 index 000000000..ed5d7db5b --- /dev/null +++ b/packages/govern-console/src/utils/types.tsx @@ -0,0 +1,89 @@ +export enum CustomTransactionStatus { + Pending, + InProgress, + Successful, + Failed, +} + +export enum CircularProgressStatus { + Disabled, + InProgress, + Done, + Failed, +} + +export type CustomTransaction = { + tx: any; + message: string; + status: CustomTransactionStatus; + // transactionOrder: number; +}; + +export type Response = { + error: string | undefined; + transactions: CustomTransaction[]; +}; + +export type abiItem = { + inputs: []; + name: string; + type: string; + stateMutability: string; +}; + +export type actionType = { + item: abiItem; + name: string; + contractAddress: string; + abi: any[]; + type: string; +}; + +export type ParamType = { + type: string; + baseType: string; + name?: string; + value: any; +}; + +export type ActionItem = { + signature: string; + sighash: string; + contractAddress: string; + name: string; + inputs: ParamType[]; + payable: boolean; + payableAmount: string; +}; + +export type ActionToSchedule = { + contractAddress: string; + name: string; + params: []; + abi: []; + numberOfInputs: number; +}; + +export type Account = { + signer: any | undefined; + address: string | null; +}; + +export type ipfsMetadata = { + metadata: any; + text: string | null; + endpoint: string | null; + error: any; +}; + +// Action builder types +export type ActionBuilderCloseHandler = (actions?: any) => void; +export type ActionBuilderState = + | 'processTransaction' + | 'deposit' + | 'withdrawAssets' + | 'mintTokens' + | 'chooseContract' + | 'chooseAction' + | 'abiForm' + | 'chooseFunctions'; diff --git a/packages/govern-console/src/utils/urls.tsx b/packages/govern-console/src/utils/urls.tsx new file mode 100644 index 000000000..047197b1a --- /dev/null +++ b/packages/govern-console/src/utils/urls.tsx @@ -0,0 +1,20 @@ +/** + * Returns the url of the DAO's settings page + * + * @param daoName the name of the DAO + * + * @returns {string} the url of the settings page + */ +export function settingsUrl(daoName: string): string { + return `/daos/${daoName}/dao-settings`; +} + +/** + * Returns the url of the Proposal details page + * @param daoName the name of the DAO + * @param containerHash the proposal container hash + * @returns {string} the url of the proposal details page + */ +export function proposalDetailsUrl(daoName: string, containerHash: string): string { + return `/daos/${daoName}/executions/${containerHash}`; +} diff --git a/packages/govern-console/src/utils/validations.tsx b/packages/govern-console/src/utils/validations.tsx new file mode 100644 index 000000000..37ad59285 --- /dev/null +++ b/packages/govern-console/src/utils/validations.tsx @@ -0,0 +1,164 @@ +import { ValidateResult } from 'react-hook-form'; +import Abi from './AbiHandler'; +import { isTokenERC20 } from 'utils/token'; +import { utils, Contract, BigNumber, providers } from 'ethers'; +import { erc20TokenABI } from 'abis/erc20'; +import { Asset } from 'utils/Asset'; +import { networkEnvironment } from 'environment'; +const { subgraphUrl } = networkEnvironment; + +/** + * Validate file size + * + * @param files + * @param size file size allowed in MB. + * @returns true if valid, or error message if invalid + */ +export const validateFileSize = async (files: FileList, size: number): Promise => { + if (files[0].size / 1024 / 1024 <= size) return true; + return `File size exceeds ${size}MB.`; +}; + +/** + * Validate if address is an ERC20 token + * + * @param address address to be validated + * @param provider + * @returns true if valid, or error message if invalid + */ +export const validateToken = async (address: string, provider: any): Promise => { + const isERC20 = await isTokenERC20(address, provider); + return isERC20 || 'Token adress is not ERC20 compliant'; +}; + +/** + * Checks if dao exists + * // TODO: Giorgi add refetch for useDaoQuery and + * use the same hook instead of the below separate function + * @param name dao name + * @returns true if valid, or error message if invalid + */ +export const daoExists = async (name: string): Promise => { + const query = ` + query Daos($name: String) { + daos(where: {name: $name}){ + id + } + } + `; + + const data = await fetch(subgraphUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: JSON.stringify({ + query, + variables: { name: name }, + }), + }); + + const daos = await data.json(); + return daos?.data?.daos?.length == 0 || 'Dao with this identifier already exists'; +}; + +/** + * Validates amount dependin on decimal. + * @dev if the decimals is 0, and amount contains fractions or + * if the decimals is more than 0 and it doesn't contain fractions, it returns an error + * + * @param amount amount + * @param decimals decimals + */ +export const validateAmountForDecimals = (amount: string, decimals: number) => { + if (parseInt(amount) < 0) { + return 'The amount must be positive'; + } + + if (!decimals) { + if (amount.includes('.')) { + return "The token doesn't contain decimals. Please enter the exact amount"; + } + return true; + } + if (!amount.includes('.')) { + return 'Include decimals, e.g. 10.0'; + } + + if (amount.split('.')[1].length > decimals) { + return `The fractional component exceeds the decimals - ${decimals}`; + } + + return true; +}; + +/** + * Check if contract is a contract + * + * @param address address to be validated + * @param provider + * @returns true if valid, or error message if invalid + */ +export const validateContract = async (address: string, provider: any): Promise => { + try { + const code = await provider.getCode(address); + if (code !== '0x') return true; + } catch (error) {} + return 'Contract address is not valid.'; +}; + +/** + * Check if a contract ABI is in good format + * + * @param abi abi to be validated + * @returns true if valid, or error message if invalid + */ +export const validateAbi = (abi: string): ValidateResult => { + return Abi.isValidAbi(abi) ? true : 'Contract ABI is not valid.'; +}; + +/** + * validates if the number is positive. + * @param num number + * @returns + */ +export const positiveNumber = (num: number | string): ValidateResult => { + if (typeof num === 'string') { + num = parseInt(num); + } + return num > 0 ? true : 'Value must be positive'; +}; + +/** + * check if the address is valid + * @param address address to be validated + * @returns true if valid, error message if invalid + */ +export const validateAddress = (address: string): ValidateResult => { + return utils.isAddress(address) ? true : 'Invalid address'; +}; + +/** + * validate that the asset balance of the owner is greater or equal to the amount + * @param asset asset to be verified + * @param ownerAddress owner address to be validated + * @param provider interface to node + * @returns true if valid, error message if invalid + */ +export const validateBalance = async ( + asset: Asset, + ownerAddress: string, + provider: providers.Web3Provider, +): Promise => { + let balance = BigNumber.from(0); + + if (asset.isEth()) { + balance = await provider.getBalance(ownerAddress); + } else { + const contract = new Contract(asset.address, erc20TokenABI, provider); + balance = await contract.balanceOf(ownerAddress); + } + + return BigNumber.from(asset.amount).lte(balance) ? true : 'Insufficient balance'; +}; diff --git a/packages/govern-console/tsconfig.json b/packages/govern-console/tsconfig.json index e26043818..98e8728ba 100644 --- a/packages/govern-console/tsconfig.json +++ b/packages/govern-console/tsconfig.json @@ -1,20 +1,22 @@ { "compilerOptions": { - "target": "es2020", + "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, - "forceConsistentCasingInFileNames": true, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react", - "noFallthroughCasesInSwitch": true + "jsx": "react-jsx", + "baseUrl": "src" }, - "include": ["src"] + "include": ["src", "decs.d.ts"], + "exclude": ["src/**/**/*.stories.tsx"] } diff --git a/packages/govern-contract-utils/.gitignore b/packages/govern-contract-utils/.gitignore index 7dd9bafd2..06621110d 100644 --- a/packages/govern-contract-utils/.gitignore +++ b/packages/govern-contract-utils/.gitignore @@ -5,7 +5,7 @@ yarn-error.log cache artifacts typechain - +abi coverage/ -coverage.json \ No newline at end of file +coverage.json diff --git a/packages/govern-contract-utils/README.md b/packages/govern-contract-utils/README.md index 6769390d2..ad10aa83c 100644 --- a/packages/govern-contract-utils/README.md +++ b/packages/govern-contract-utils/README.md @@ -1 +1 @@ -# Govern contract utils \ No newline at end of file +# Govern contract utils diff --git a/packages/govern-contract-utils/contracts/erc20/ERC20.sol b/packages/govern-contract-utils/contracts/erc20/ERC20.sol index ba802f37a..f35fe1ed0 100644 --- a/packages/govern-contract-utils/contracts/erc20/ERC20.sol +++ b/packages/govern-contract-utils/contracts/erc20/ERC20.sol @@ -9,6 +9,14 @@ pragma solidity ^0.6.8; * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface ERC20 { + // Optional fields + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); + + function totalSupply() external view returns (uint256); function balanceOf(address _who) external view returns (uint256); diff --git a/packages/govern-contract-utils/hardhat.config.ts b/packages/govern-contract-utils/hardhat.config.ts index faf727d46..f20a54610 100644 --- a/packages/govern-contract-utils/hardhat.config.ts +++ b/packages/govern-contract-utils/hardhat.config.ts @@ -4,6 +4,7 @@ import '@nomiclabs/hardhat-ethers' import '@nomiclabs/hardhat-waffle' import 'hardhat-typechain' import 'solidity-coverage' +import 'hardhat-abi-exporter' const config: HardhatUserConfig = { solidity: { diff --git a/packages/govern-contract-utils/test/acl.test.ts b/packages/govern-contract-utils/test/acl.test.ts index d4ef1e3a1..151039fb3 100644 --- a/packages/govern-contract-utils/test/acl.test.ts +++ b/packages/govern-contract-utils/test/acl.test.ts @@ -1,21 +1,18 @@ import { expect } from 'chai' import { ethers } from 'hardhat' import { Signer } from 'ethers' -import { - ACL, - ACL__factory -} from '../typechain' +import { ACL, ACL__factory } from '../typechain' const ERRORS = { AUTH: 'acl: auth', FROZEN: 'acl: frozen', - BAD_FREEZE: 'acl: bad freeze' + BAD_FREEZE: 'acl: bad freeze', } const EVENTS = { GRANTED: 'Granted', REVOKED: 'Revoked', - FROZEN: 'Frozen' + FROZEN: 'Frozen', } const ROLE = '0xabcdabcd' @@ -43,11 +40,18 @@ describe('ACL', function () { }) const grant = (inst: ACL, role = ROLE, who = notRoot) => inst.grant(role, who) - const revoke = (inst: ACL, role = ROLE, who = notRoot) => inst.revoke(role, who) + const revoke = (inst: ACL, role = ROLE, who = notRoot) => + inst.revoke(role, who) const freeze = (inst: ACL, role = ROLE) => inst.freeze(role) - const assertRole = async (shouldHaveRole = true, role = ROLE, who = notRoot) => - expect(await acl.roles(role, who)).to.equal(shouldHaveRole ? ALLOW_ROLE : NO_ROLE) + const assertRole = async ( + shouldHaveRole = true, + role = ROLE, + who = notRoot + ) => + expect(await acl.roles(role, who)).to.equal( + shouldHaveRole ? ALLOW_ROLE : NO_ROLE + ) context('granting', async () => { beforeEach('root grants', async () => { @@ -140,73 +144,81 @@ describe('ACL', function () { }) it('root cannot freeze by granting', async () => { - await expect(grant(acl, ROLE, FREEZE_ADDR)).to.be.revertedWith(ERRORS.BAD_FREEZE) + await expect(grant(acl, ROLE, FREEZE_ADDR)).to.be.revertedWith( + ERRORS.BAD_FREEZE + ) }) context('ACL.bulk', () => { it('Grant', async () => { - await expect(acl.bulk([ - { - op: 0, - role: ROLE, - who: notRoot - } - ])).to.emit(acl, EVENTS.GRANTED) + await expect( + acl.bulk([ + { + op: 0, + role: ROLE, + who: notRoot, + }, + ]) + ).to.emit(acl, EVENTS.GRANTED) await assertRole(true, ROLE, notRoot) }) it('Revoke', async () => { - await expect(acl.bulk([ - { - op: 1, - role: ROLE, - who: notRoot - } - ])).to.emit(acl, EVENTS.REVOKED) + await expect( + acl.bulk([ + { + op: 1, + role: ROLE, + who: notRoot, + }, + ]) + ).to.emit(acl, EVENTS.REVOKED) await assertRole(false, ROLE, notRoot) }) it('Freeze', async () => { - await expect(acl.bulk([ - { - op: 2, - role: ROLE, - who: '0x0000000000000000000000000000000000000000' - } - ])).to.emit(acl, EVENTS.FROZEN) - - expect(await acl.roles(ROLE, FREEZE_ADDR)) - .to.equal(FREEZE_ADDR) + await expect( + acl.bulk([ + { + op: 2, + role: ROLE, + who: '0x0000000000000000000000000000000000000000', + }, + ]) + ).to.emit(acl, EVENTS.FROZEN) + + expect(await acl.roles(ROLE, FREEZE_ADDR)).to.equal(FREEZE_ADDR) }) - it("Grant, revoke, and freeze", async () => { - await expect(acl.bulk([ - { - op: 0, - role: ROLE, - who: notRoot - }, - { - op: 1, - role: ROLE, - who: notRoot - }, - { - op: 2, - role: ROLE, - who: '0x0000000000000000000000000000000000000000' - } - ])) + it('Grant, revoke, and freeze', async () => { + await expect( + acl.bulk([ + { + op: 0, + role: ROLE, + who: notRoot, + }, + { + op: 1, + role: ROLE, + who: notRoot, + }, + { + op: 2, + role: ROLE, + who: '0x0000000000000000000000000000000000000000', + }, + ]) + ) .to.emit(acl, EVENTS.GRANTED) .to.emit(acl, EVENTS.REVOKED) .to.emit(acl, EVENTS.FROZEN) await assertRole(false, ROLE, notRoot) - expect(await acl.roles(ROLE, FREEZE_ADDR)) - .to.equal(FREEZE_ADDR) + expect(await acl.roles(ROLE, FREEZE_ADDR)).to.equal(FREEZE_ADDR) }) }) }) diff --git a/packages/govern-contract-utils/test/adaptive-erc165.test.ts b/packages/govern-contract-utils/test/adaptive-erc165.test.ts index d09841d9f..1a5944f6f 100644 --- a/packages/govern-contract-utils/test/adaptive-erc165.test.ts +++ b/packages/govern-contract-utils/test/adaptive-erc165.test.ts @@ -6,7 +6,7 @@ import { AdaptiveERC165Mock, AdaptiveERC165MockHelper, AdaptiveERC165Mock__factory, - AdaptiveERC165MockHelper__factory + AdaptiveERC165MockHelper__factory, } from '../typechain' const ERRORS = { @@ -22,7 +22,7 @@ const EVENTS = { const beefInterfaceId = '0xbeefbeef' const callbackSig = hexDataSlice(id('callbackFunc()'), 0, 4) // 0x1eb2075a const magicNumber = '0x10000000' -const magicNumberReturn = magicNumber + "0".repeat(56) +const magicNumberReturn = magicNumber + '0'.repeat(56) describe('AdaptiveErc165', function () { let adaptive: AdaptiveERC165Mock, signers: Signer[] @@ -57,9 +57,9 @@ describe('AdaptiveErc165', function () { }) it('ensures support the right interfaceID', async () => { - await expect( - await adaptive.supportsInterface(beefInterfaceId) - ).to.equal(true) + await expect(await adaptive.supportsInterface(beefInterfaceId)).to.equal( + true + ) }) it('ensures the right callback was call with the right memory value', async () => { @@ -83,9 +83,7 @@ describe('AdaptiveErc165', function () { }) it('returns the correct value from handleCallback assembly', async () => { - await expect( - adaptiveHelper.handleCallback(callbackSig) - ) + await expect(adaptiveHelper.handleCallback(callbackSig)) .to.emit(adaptiveHelper, EVENTS.RECEIVED_CALLBACK) .withArgs(magicNumberReturn) }) diff --git a/packages/govern-contract-utils/test/address-utils.test.ts b/packages/govern-contract-utils/test/address-utils.test.ts index 3eb5dceb3..deb17d9e6 100644 --- a/packages/govern-contract-utils/test/address-utils.test.ts +++ b/packages/govern-contract-utils/test/address-utils.test.ts @@ -1,32 +1,28 @@ import { expect } from 'chai' import { ethers } from 'hardhat' -import { - AddressUtilsMock, - AddressUtilsMock__factory -} from '../typechain' - +import { AddressUtilsMock, AddressUtilsMock__factory } from '../typechain' describe('AddressUtils', function () { let addressUtils: AddressUtilsMock - let owner: any; + let owner: any beforeEach(async () => { - const AddressUtilsMock = (await ethers.getContractFactory('AddressUtilsMock')) as AddressUtilsMock__factory + const AddressUtilsMock = (await ethers.getContractFactory( + 'AddressUtilsMock' + )) as AddressUtilsMock__factory addressUtils = await AddressUtilsMock.deploy() owner = await (await ethers.getSigners())[0].getAddress() }) it('returns false if the address is not the contract', async () => { - expect(await addressUtils.isContract(owner)).to.equal(false); + expect(await addressUtils.isContract(owner)).to.equal(false) }) it('returns true if the address is the contract', async () => { - expect(await addressUtils.isContract(addressUtils.address)).to.equal(true); + expect(await addressUtils.isContract(addressUtils.address)).to.equal(true) }) it('returns the same address that was passed', async () => { - expect(await addressUtils.toPayable(owner)).to.equal(owner); + expect(await addressUtils.toPayable(owner)).to.equal(owner) }) - }) - diff --git a/packages/govern-contract-utils/test/bitmaplib.test.ts b/packages/govern-contract-utils/test/bitmaplib.test.ts index 96a8243ce..397ce2bce 100644 --- a/packages/govern-contract-utils/test/bitmaplib.test.ts +++ b/packages/govern-contract-utils/test/bitmaplib.test.ts @@ -1,20 +1,21 @@ import { expect } from 'chai' import { ethers } from 'hardhat' -import { - BitmapLibMock, - BitmapLibMock__factory -} from '../typechain' +import { BitmapLibMock, BitmapLibMock__factory } from '../typechain' describe('Bitmap', function () { let lib: BitmapLibMock beforeEach(async () => { - const BitmapLib = (await ethers.getContractFactory('BitmapLibMock')) as BitmapLibMock__factory + const BitmapLib = (await ethers.getContractFactory( + 'BitmapLibMock' + )) as BitmapLibMock__factory lib = await BitmapLib.deploy() }) it('flips', async () => { - expect(await lib.flip(await lib.empty(), 1)).to.equal(`0x${'00'.repeat(31)}02`) + expect(await lib.flip(await lib.empty(), 1)).to.equal( + `0x${'00'.repeat(31)}02` + ) }) it('randomly flip and check', async () => { diff --git a/packages/govern-contract-utils/test/deposit-lib.test.ts b/packages/govern-contract-utils/test/deposit-lib.test.ts index 47ecccf0d..29dafab21 100644 --- a/packages/govern-contract-utils/test/deposit-lib.test.ts +++ b/packages/govern-contract-utils/test/deposit-lib.test.ts @@ -2,118 +2,130 @@ import { expect } from 'chai' import { ethers } from 'hardhat' import { - DepositLibMock, DepositLibMock__factory, - GoodToken, GoodToken__factory + DepositLibMock, + DepositLibMock__factory, + GoodToken, + GoodToken__factory, } from '../typechain' const EVENTS = { - LOCKED: 'Locked', - UNLOCKED: 'Unlocked', - TRANSFER: 'Transfer' + LOCKED: 'Locked', + UNLOCKED: 'Unlocked', + TRANSFER: 'Transfer', } const ERRORS = { - BAD_TOKEN_LOCK: "deposit: bad token lock", - BAD_TOKEN_RELEASE: "deposit: bad token release" + BAD_TOKEN_LOCK: 'deposit: bad token lock', + BAD_TOKEN_RELEASE: 'deposit: bad token release', } const amount = 1000 describe('DepositLib', function () { - let depositLibMock: DepositLibMock, - goodToken: GoodToken, - owner: any; + let depositLibMock: DepositLibMock, goodToken: GoodToken, owner: any + before(async () => { + const DepositLibMockFactory = (await ethers.getContractFactory( + 'DepositLibMock' + )) as DepositLibMock__factory + depositLibMock = await DepositLibMockFactory.deploy() + + owner = await (await ethers.getSigners())[0].getAddress() + }) + + describe('collectFrom', async () => { + before(async () => { + const GoodTokenFactory = (await ethers.getContractFactory( + 'GoodToken' + )) as GoodToken__factory + goodToken = await GoodTokenFactory.deploy() + }) + + it('reverts if the token in the collateral is not a contract', async () => { + const deposit = { + token: owner, + amount: amount, + } + await expect( + depositLibMock.collectFrom(deposit, owner) + ).to.be.revertedWith(ERRORS.BAD_TOKEN_LOCK) + }) + + it("reverts if the token's `from` address doesn't have approval for `to` address", async () => { + const deposit = { + token: goodToken.address, + amount: amount, + } + + await expect( + depositLibMock.collectFrom(deposit, owner) + ).to.be.revertedWith(ERRORS.BAD_TOKEN_LOCK) + }) + + it('successfully makes the transfer and emits the events', async () => { + const deposit = { + token: goodToken.address, + amount: amount, + } + + await goodToken.setBalanceTo(owner, amount) + + let tx = await depositLibMock.collectFrom(deposit, owner) + + await expect(tx) + .to.emit(goodToken, EVENTS.TRANSFER) + .withArgs(owner, depositLibMock.address, amount) + .to.emit(depositLibMock, EVENTS.LOCKED) + .withArgs(goodToken.address, owner, amount) + }) + }) + + describe('releaseTo', async () => { before(async () => { - const DepositLibMockFactory = (await ethers.getContractFactory('DepositLibMock')) as DepositLibMock__factory - depositLibMock = await DepositLibMockFactory.deploy() + const GoodTokenFactory = (await ethers.getContractFactory( + 'GoodToken' + )) as GoodToken__factory + goodToken = await GoodTokenFactory.deploy() + }) - owner = await (await ethers.getSigners())[0].getAddress() + it('reverts if the token in the collateral is not a contract', async () => { + const deposit = { + token: owner, + amount: amount, + } + await expect(depositLibMock.releaseTo(deposit, owner)).to.be.revertedWith( + ERRORS.BAD_TOKEN_RELEASE + ) }) + it("reverts if the contract doesn't have enough balance to make the transfer", async () => { + const deposit = { + token: goodToken.address, + amount: amount, + } - describe('collectFrom', async () => { - before(async () => { - const GoodTokenFactory = (await ethers.getContractFactory('GoodToken')) as GoodToken__factory - goodToken = await GoodTokenFactory.deploy(); - }) - - it("reverts if the token in the collateral is not a contract", async () => { - const deposit = { - token: owner, - amount: amount, - } - await expect(depositLibMock.collectFrom(deposit, owner)).to.be.revertedWith(ERRORS.BAD_TOKEN_LOCK) - }) - - it("reverts if the token's `from` address doesn't have approval for `to` address", async () => { - const deposit = { - token: goodToken.address, - amount: amount, - } - - await expect(depositLibMock.collectFrom(deposit, owner)).to.be.revertedWith(ERRORS.BAD_TOKEN_LOCK) - }) - - it("successfully makes the transfer and emits the events", async () => { - const deposit = { - token: goodToken.address, - amount: amount, - } - - await goodToken.setBalanceTo(owner, amount); - - let tx =await depositLibMock.collectFrom(deposit, owner); - - await expect(tx) - .to.emit(goodToken, EVENTS.TRANSFER) - .withArgs(owner, depositLibMock.address, amount) - .to.emit(depositLibMock, EVENTS.LOCKED) - .withArgs(goodToken.address, owner, amount) - }) + await expect(depositLibMock.releaseTo(deposit, owner)).to.be.revertedWith( + ERRORS.BAD_TOKEN_RELEASE + ) }) + it('successfully makes the transfer and emits the events', async () => { + const deposit = { + token: goodToken.address, + amount: amount, + } + + await goodToken.setBalanceTo(depositLibMock.address, amount) + + let tx = depositLibMock.releaseTo(deposit, owner) - describe('releaseTo', async () => { - before(async () => { - const GoodTokenFactory = (await ethers.getContractFactory('GoodToken')) as GoodToken__factory - goodToken = await GoodTokenFactory.deploy(); - }) - - it("reverts if the token in the collateral is not a contract", async () => { - const deposit = { - token: owner, - amount: amount, - } - await expect(depositLibMock.releaseTo(deposit, owner)).to.be.revertedWith(ERRORS.BAD_TOKEN_RELEASE) - }) - - it("reverts if the contract doesn't have enough balance to make the transfer", async () => { - const deposit = { - token: goodToken.address, - amount: amount, - } - - await expect(depositLibMock.releaseTo(deposit, owner)).to.be.revertedWith(ERRORS.BAD_TOKEN_RELEASE) - }) - - it("successfully makes the transfer and emits the events", async () => { - const deposit = { - token: goodToken.address, - amount: amount, - } - - await goodToken.setBalanceTo(depositLibMock.address, amount); - - let tx = depositLibMock.releaseTo(deposit, owner); - - // TODO: the chaining turns out to be wrong. if the first withArgs fail, and the second withArgs doesn't fail, - // the below throws unhandledPromiseRejection and says that they are not equal, but doesn't make the tests fail. - await expect(tx) - .to.emit(goodToken, EVENTS.TRANSFER) - .withArgs(depositLibMock.address, owner, amount) - .to.emit(depositLibMock, EVENTS.UNLOCKED) - .withArgs(goodToken.address, owner, amount) - }) + // TODO: the chaining turns out to be wrong. if the first withArgs fail, and the second withArgs doesn't fail, + // the below throws unhandledPromiseRejection and says that they are not equal, but doesn't make the tests fail. + await expect(tx) + .to.emit(goodToken, EVENTS.TRANSFER) + .withArgs(depositLibMock.address, owner, amount) + .to.emit(depositLibMock, EVENTS.UNLOCKED) + .withArgs(goodToken.address, owner, amount) }) + }) }) diff --git a/packages/govern-contract-utils/test/erc1167-proxy-factory.test.ts b/packages/govern-contract-utils/test/erc1167-proxy-factory.test.ts index fd9f5cb8b..bbbbfa2a0 100644 --- a/packages/govern-contract-utils/test/erc1167-proxy-factory.test.ts +++ b/packages/govern-contract-utils/test/erc1167-proxy-factory.test.ts @@ -6,10 +6,9 @@ import { CloneFactoryMock__factory, CloneFactoryMock, ClonedContract, - ClonedContractWithInit + ClonedContractWithInit, } from '../typechain' - describe('ERC1167ProxyFactory', () => { let signers: Signer[], owner: string, @@ -20,7 +19,9 @@ describe('ERC1167ProxyFactory', () => { before(async () => { signers = await ethers.getSigners() owner = await signers[0].getAddress() - const CloneFactoryMock = (await ethers.getContractFactory('CloneFactoryMock')) as CloneFactoryMock__factory + const CloneFactoryMock = (await ethers.getContractFactory( + 'CloneFactoryMock' + )) as CloneFactoryMock__factory factory = await CloneFactoryMock.deploy() }) @@ -35,8 +36,7 @@ describe('ERC1167ProxyFactory', () => { signers[0] )) as ClonedContract - expect(await clonedContract.getRandomString()) - .to.be.equal('NO INIT') + expect(await clonedContract.getRandomString()).to.be.equal('NO INIT') }) it('clone with constructor parameters', async () => { @@ -49,8 +49,7 @@ describe('ERC1167ProxyFactory', () => { signers[0] )) as ClonedContractWithInit - expect(await clonedContract.randomString()) - .to.be.equal('INIT DATA') + expect(await clonedContract.randomString()).to.be.equal('INIT DATA') }) }) @@ -65,8 +64,7 @@ describe('ERC1167ProxyFactory', () => { signers[0] )) as ClonedContract - expect(await clonedContract.getRandomString()) - .to.be.equal('NO INIT') + expect(await clonedContract.getRandomString()).to.be.equal('NO INIT') }) it('clone with constructor parameters', async () => { @@ -79,27 +77,26 @@ describe('ERC1167ProxyFactory', () => { signers[0] )) as ClonedContractWithInit - expect(await clonedContract.randomString()) - .to.be.equal('INIT DATA') + expect(await clonedContract.randomString()).to.be.equal('INIT DATA') }) }) context('Helper methods', () => { it('calls "generateCreateData" as expected', async () => { - const cloningContract = (await factory.cloningContract()).substring(2).toLowerCase() + const cloningContract = (await factory.cloningContract()) + .substring(2) + .toLowerCase() await factory.generateCreateData() - expect(await factory.generatedCreateData()) - .to.equal(`0x3d602d80600a3d3981f3363d3d373d3d3d363d73${cloningContract}5af43d82803e903d91602b57fd5bf3`) + expect(await factory.generatedCreateData()).to.equal( + `0x3d602d80600a3d3981f3363d3d373d3d3d363d73${cloningContract}5af43d82803e903d91602b57fd5bf3` + ) }) it('calls "_getRevertMsg" with a revert message', async () => { await factory.getRevertMessage( '0x08c379a0' + - defaultAbiCoder.encode( - ['string'], - ['Revert Message'] - ).substr(2) + defaultAbiCoder.encode(['string'], ['Revert Message']).substr(2) ) expect(await factory.revertMessage()).to.equal('Revert Message') diff --git a/packages/govern-contract-utils/test/initializable.test.ts b/packages/govern-contract-utils/test/initializable.test.ts index 0486daa48..0582f0884 100644 --- a/packages/govern-contract-utils/test/initializable.test.ts +++ b/packages/govern-contract-utils/test/initializable.test.ts @@ -1,9 +1,6 @@ import { expect } from 'chai' import { ethers } from 'hardhat' -import { - InitializableMock, - InitializableMock__factory -} from '../typechain' +import { InitializableMock, InitializableMock__factory } from '../typechain' // NOTE: We cannot assert on the values emitted // in the events currently, see: https://github.com/EthWorks/Waffle/issues/87 @@ -11,28 +8,30 @@ describe('Initializable', function () { let init: InitializableMock beforeEach(async () => { - const Initializable = (await ethers.getContractFactory('InitializableMock')) as InitializableMock__factory + const Initializable = (await ethers.getContractFactory( + 'InitializableMock' + )) as InitializableMock__factory init = await Initializable.deploy() }) it('ensures an init function can only be called once', async () => { - await expect(init.initOne()) - .to.emit(init, 'Initialized') - await expect(init.initOne()) - .to.be.revertedWith('initializable: already initialized') + await expect(init.initOne()).to.emit(init, 'Initialized') + await expect(init.initOne()).to.be.revertedWith( + 'initializable: already initialized' + ) }) it('locks functions based on init key', async () => { // Can both be called since they use different keys - await expect(init.initOne()) - .to.emit(init, 'Initialized') - await expect(init.initTwo()) - .to.emit(init, 'Initialized') + await expect(init.initOne()).to.emit(init, 'Initialized') + await expect(init.initTwo()).to.emit(init, 'Initialized') // .. but can still only be called once - await expect(init.initOne()) - .to.be.revertedWith('initializable: already initialized') - await expect(init.initTwo()) - .to.be.revertedWith('initializable: already initialized') + await expect(init.initOne()).to.be.revertedWith( + 'initializable: already initialized' + ) + await expect(init.initTwo()).to.be.revertedWith( + 'initializable: already initialized' + ) }) }) diff --git a/packages/govern-contract-utils/test/safe-erc20.test.ts b/packages/govern-contract-utils/test/safe-erc20.test.ts index 574a6f7cf..657594717 100644 --- a/packages/govern-contract-utils/test/safe-erc20.test.ts +++ b/packages/govern-contract-utils/test/safe-erc20.test.ts @@ -1,92 +1,133 @@ import { expect } from 'chai' import { ethers } from 'hardhat' import { - SafeERC20Mock, SafeERC20Mock__factory, - GoodToken, GoodToken__factory, - BadToken, BadToken__factory, - WorstToken, WorstToken__factory + SafeERC20Mock, + SafeERC20Mock__factory, + GoodToken, + GoodToken__factory, + BadToken, + BadToken__factory, + WorstToken, + WorstToken__factory, } from '../typechain' - const balanceAmount = 10000 -const EVENTS = { - Transfer: 'Transfer', - TransferFrom: 'TransferFrom', - Approve: 'Approve' +const EVENTS = { + Transfer: 'Transfer', + TransferFrom: 'TransferFrom', + Approve: 'Approve', } const ERRORS = { - SAFE_TRANSFER: "SAFE_TRANSFER: Fail", - SAFE_TRANSFER_FROM: "SAFE_TRANSFER_FROM: Fail" + SAFE_TRANSFER: 'SAFE_TRANSFER: Fail', + SAFE_TRANSFER_FROM: 'SAFE_TRANSFER_FROM: Fail', } - describe('SafeERC20', function () { - let safeERC20: SafeERC20Mock - - let badToken: BadToken - let goodToken: GoodToken - let worstToken: WorstToken - - let owner: any; - - beforeEach(async () => { - const safeERCMock = (await ethers.getContractFactory('SafeERC20Mock')) as SafeERC20Mock__factory - safeERC20 = await safeERCMock.deploy() - - const BadToken = (await ethers.getContractFactory('BadToken')) as BadToken__factory - badToken = await BadToken.deploy() - badToken.setBalanceTo(safeERC20.address, balanceAmount) - - const GoodToken = (await ethers.getContractFactory('GoodToken')) as GoodToken__factory - goodToken = await GoodToken.deploy(); - goodToken.setBalanceTo(safeERC20.address, balanceAmount) - - const WorstToken = (await ethers.getContractFactory('WorstToken')) as WorstToken__factory - worstToken = await WorstToken.deploy(); - worstToken.setBalanceTo(safeERC20.address, balanceAmount) - - owner = await (await ethers.getSigners())[0].getAddress() + let safeERC20: SafeERC20Mock + + let badToken: BadToken + let goodToken: GoodToken + let worstToken: WorstToken + + let owner: any + + beforeEach(async () => { + const safeERCMock = (await ethers.getContractFactory( + 'SafeERC20Mock' + )) as SafeERC20Mock__factory + safeERC20 = await safeERCMock.deploy() + + const BadToken = (await ethers.getContractFactory( + 'BadToken' + )) as BadToken__factory + badToken = await BadToken.deploy() + badToken.setBalanceTo(safeERC20.address, balanceAmount) + + const GoodToken = (await ethers.getContractFactory( + 'GoodToken' + )) as GoodToken__factory + goodToken = await GoodToken.deploy() + goodToken.setBalanceTo(safeERC20.address, balanceAmount) + + const WorstToken = (await ethers.getContractFactory( + 'WorstToken' + )) as WorstToken__factory + worstToken = await WorstToken.deploy() + worstToken.setBalanceTo(safeERC20.address, balanceAmount) + + owner = await (await ethers.getSigners())[0].getAddress() + }) + + it('reverts if the token address is a EOA', async () => { + await expect( + safeERC20.safeTransfer(owner, balanceAmount) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER) + }) + + describe('Safe Transfer', () => { + it('succeeds when the amount is not too big', async () => { + await expect( + safeERC20.safeTransfer(goodToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) + await expect( + safeERC20.safeTransfer(badToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) + await expect( + safeERC20.safeTransfer(worstToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) }) - - it("reverts if the token address is a EOA", async () => { - await expect(safeERC20.safeTransfer(owner, balanceAmount)).to.be.revertedWith(ERRORS.SAFE_TRANSFER) + it('reverts when amount is too big', async () => { + await expect( + safeERC20.safeTransfer(goodToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER) + await expect( + safeERC20.safeTransfer(badToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER) + await expect( + safeERC20.safeTransfer(worstToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER) }) - - describe("Safe Transfer", () => { - it("succeeds when the amount is not too big", async () => { - await expect(safeERC20.safeTransfer(goodToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - await expect(safeERC20.safeTransfer(badToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - await expect(safeERC20.safeTransfer(worstToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - }) - - it("reverts when amount is too big", async () => { - await expect(safeERC20.safeTransfer(goodToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER) - await expect(safeERC20.safeTransfer(badToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER) - await expect(safeERC20.safeTransfer(worstToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER) - }) + }) + + describe('Safe Transfer From', () => { + it('succeeds when the amount is not too big', async () => { + await expect( + safeERC20.safeTransferFrom(goodToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) + await expect( + safeERC20.safeTransferFrom(badToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) + await expect( + safeERC20.safeTransferFrom(worstToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Transfer) }) - describe("Safe Transfer From", () => { - it("succeeds when the amount is not too big", async () => { - await expect(safeERC20.safeTransferFrom(goodToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - await expect(safeERC20.safeTransferFrom(badToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - await expect(safeERC20.safeTransferFrom(worstToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Transfer); - }) - - it("reverts when amount is too big", async () => { - await expect(safeERC20.safeTransferFrom(goodToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) - await expect(safeERC20.safeTransferFrom(badToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) - await expect(safeERC20.safeTransferFrom(worstToken.address, balanceAmount + 1)).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) - }) + it('reverts when amount is too big', async () => { + await expect( + safeERC20.safeTransferFrom(goodToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) + await expect( + safeERC20.safeTransferFrom(badToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) + await expect( + safeERC20.safeTransferFrom(worstToken.address, balanceAmount + 1) + ).to.be.revertedWith(ERRORS.SAFE_TRANSFER_FROM) }) - - describe("Safe Approve", () => { - it("succeeds in all cases for all types of tokens", async () => { - await expect(safeERC20.safeApprove(goodToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Approve); - await expect(safeERC20.safeApprove(badToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Approve); - await expect(safeERC20.safeApprove(worstToken.address, balanceAmount)).to.emit(safeERC20, EVENTS.Approve); - }) + }) + + describe('Safe Approve', () => { + it('succeeds in all cases for all types of tokens', async () => { + await expect( + safeERC20.safeApprove(goodToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Approve) + await expect( + safeERC20.safeApprove(badToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Approve) + await expect( + safeERC20.safeApprove(worstToken.address, balanceAmount) + ).to.emit(safeERC20, EVENTS.Approve) }) + }) }) diff --git a/packages/govern-contract-utils/tsconfig.json b/packages/govern-contract-utils/tsconfig.json index 7122bba0f..5ec486223 100644 --- a/packages/govern-contract-utils/tsconfig.json +++ b/packages/govern-contract-utils/tsconfig.json @@ -10,4 +10,3 @@ }, "include": ["hardhat.config.ts", "./test"] } - diff --git a/packages/govern-core/contracts/Govern.sol b/packages/govern-core/contracts/Govern.sol index 23915ac33..36431796b 100644 --- a/packages/govern-core/contracts/Govern.sol +++ b/packages/govern-core/contracts/Govern.sol @@ -11,20 +11,43 @@ import "erc3k/contracts/IERC3000.sol"; import "@aragon/govern-contract-utils/contracts/acl/ACL.sol"; import "@aragon/govern-contract-utils/contracts/adaptive-erc165/AdaptiveERC165.sol"; import "@aragon/govern-contract-utils/contracts/bitmaps/BitmapLib.sol"; +import "@aragon/govern-contract-utils/contracts/address-utils/AddressUtils.sol"; +import "@aragon/govern-contract-utils/contracts/erc20/ERC20.sol"; +import "@aragon/govern-contract-utils/contracts/erc20/SafeERC20.sol"; import "./erc1271/ERC1271.sol"; contract Govern is IERC3000Executor, AdaptiveERC165, ERC1271, ACL { using BitmapLib for bytes32; + using AddressUtils for address; + using SafeERC20 for ERC20; + + string private constant ERROR_DEPOSIT_AMOUNT_ZERO = "GOVERN_DEPOSIT_AMOUNT_ZERO"; + string private constant ERROR_ETH_DEPOSIT_AMOUNT_MISMATCH = "GOVERN_ETH_DEPOSIT_AMOUNT_MISMATCH"; + string private constant ERROR_TOKEN_NOT_CONTRACT = "GOVERN_TOKEN_NOT_CONTRACT"; + string private constant ERROR_TOKEN_DEPOSIT_FAILED = "GOVERN_TOKEN_DEPOSIT_FAILED"; + string private constant ERROR_TOO_MANY_ACTIONS = "GOVERN_TOO_MANY_ACTIONS"; + string private constant ERROR_ACTION_CALL_FAILED = "GOVERN_ACTION_CALL_FAILED"; + string private constant ERROR_TOKEN_WITHDRAW_FAILED = "GOVERN_TOKEN_WITHDRAW_FAILED"; + string private constant ERROR_ETH_WITHDRAW_FAILED = "GOVERN_ETH_WITHDRAW_FAILED"; bytes4 internal constant EXEC_ROLE = this.exec.selector; + bytes4 internal constant WITHDRAW_ROLE = this.withdraw.selector; + bytes4 internal constant REGISTER_STANDARD_ROLE = this.registerStandardAndCallback.selector; bytes4 internal constant SET_SIGNATURE_VALIDATOR_ROLE = this.setSignatureValidator.selector; uint256 internal constant MAX_ACTIONS = 256; ERC1271 signatureValidator; - event ETHDeposited(address indexed sender, uint256 value); + // ETHDeposited and Deposited are both needed. ETHDeposited makes sure that whoever sends funds + // with `send/transfer`, receive function can still be executed without reverting due to gas cost + // increases in EIP-2929. To still use `send/transfer`, access list is needed that has the address + // of the contract(base contract) that is behind the proxy. + event ETHDeposited(address sender, uint256 amount); + + event Deposited(address indexed sender, address indexed token, uint256 amount, string _reference); + event Withdrawn(address indexed token, address indexed to, address from, uint256 amount, string _reference); constructor(address _initialExecutor) ACL(address(this)) public { initialize(_initialExecutor); @@ -32,6 +55,11 @@ contract Govern is IERC3000Executor, AdaptiveERC165, ERC1271, ACL { function initialize(address _initialExecutor) public initACL(address(this)) onlyInit("govern") { _grant(EXEC_ROLE, address(_initialExecutor)); + _grant(WITHDRAW_ROLE, address(this)); + + // freeze the withdraw so that only GovernExecutor can call + _freeze(WITHDRAW_ROLE); + _grant(REGISTER_STANDARD_ROLE, address(this)); _grant(SET_SIGNATURE_VALIDATOR_ROLE, address(this)); @@ -47,8 +75,30 @@ contract Govern is IERC3000Executor, AdaptiveERC165, ERC1271, ACL { _handleCallback(msg.sig, msg.data); // WARN: does a low-level return, any code below would be unreacheable } + function deposit(address _token, uint256 _amount, string calldata _reference) external payable { + require(_amount > 0, ERROR_DEPOSIT_AMOUNT_ZERO); + + if (_token == address(0)) { + require(msg.value == _amount, ERROR_ETH_DEPOSIT_AMOUNT_MISMATCH); + } else { + require(_token.isContract(), ERROR_TOKEN_NOT_CONTRACT); + require(ERC20(_token).safeTransferFrom(msg.sender, address(this), _amount), ERROR_TOKEN_DEPOSIT_FAILED); + } + emit Deposited(msg.sender, _token, _amount, _reference); + } + + function withdraw(address _token, address _from, address _to, uint256 _amount, string memory _reference) public auth(WITHDRAW_ROLE) { + if (_token == address(0)) { + (bool ok, ) = _to.call{value: _amount}(""); + require(ok, ERROR_ETH_WITHDRAW_FAILED); + } else { + require(ERC20(_token).safeTransfer(_to, _amount), ERROR_TOKEN_WITHDRAW_FAILED); + } + emit Withdrawn(_token, _to, _from, _amount, _reference); + } + function exec(ERC3000Data.Action[] memory actions, bytes32 allowFailuresMap, bytes32 memo) override public auth(EXEC_ROLE) returns (bytes32, bytes[] memory) { - require(actions.length <= MAX_ACTIONS, "govern: too many"); // need to limit since we use 256-bit bitmaps + require(actions.length <= MAX_ACTIONS, ERROR_TOO_MANY_ACTIONS); // need to limit since we use 256-bit bitmaps bytes[] memory execResults = new bytes[](actions.length); bytes32 failureMap = BitmapLib.empty; // start with an empty bitmap @@ -56,7 +106,7 @@ contract Govern is IERC3000Executor, AdaptiveERC165, ERC1271, ACL { for (uint256 i = 0; i < actions.length; i++) { // TODO: optimize with assembly (bool ok, bytes memory ret) = actions[i].to.call{value: actions[i].value}(actions[i].data); - require(ok || allowFailuresMap.get(uint8(i)), "govern: call"); + require(ok || allowFailuresMap.get(uint8(i)), ERROR_ACTION_CALL_FAILED); // if a call fails, flip that bit to signal failure failureMap = ok ? failureMap : failureMap.flip(uint8(i)); execResults[i] = ret; diff --git a/packages/govern-core/contracts/GovernRegistry.sol b/packages/govern-core/contracts/GovernRegistry.sol index a114d60eb..83088da33 100644 --- a/packages/govern-core/contracts/GovernRegistry.sol +++ b/packages/govern-core/contracts/GovernRegistry.sol @@ -17,6 +17,7 @@ contract GovernRegistry is IERC3000Registry { IERC3000Executor _executor, IERC3000 _queue, IERC20 _token, + address minter, string calldata _name, bytes calldata _initialMetadata ) override external @@ -25,7 +26,7 @@ contract GovernRegistry is IERC3000Registry { nameUsed[_name] = true; - emit Registered(_executor, _queue, _token, msg.sender, _name); + emit Registered(_executor, _queue, _token, minter, msg.sender, _name); _setMetadata(_executor, _initialMetadata); } diff --git a/packages/govern-core/contracts/pipelines/GovernQueue.sol b/packages/govern-core/contracts/pipelines/GovernQueue.sol index 913696a14..4069a0354 100644 --- a/packages/govern-core/contracts/pipelines/GovernQueue.sol +++ b/packages/govern-core/contracts/pipelines/GovernQueue.sol @@ -103,7 +103,13 @@ contract GovernQueue is IERC3000, IArbitrable, AdaptiveERC165, ACL { require(_container.payload.executionTime >= _container.config.executionDelay.add(block.timestamp), "queue: bad delay"); // ensure that the submitter of the payload is also the sender of this call require(_container.payload.submitter == msg.sender, "queue: bad submitter"); - + // Restrict the size of calldata to _container.config.maxCalldataSize to make sure challenge function stays callable + uint calldataSize; + assembly { + calldataSize := calldatasize() + } + require(calldataSize <= _container.config.maxCalldataSize, "calldatasize: limit exceeded"); + // store and set container's hash containerHash = ERC3000Data.containerHash(_container.payload.hash(), _configHash); queue[containerHash].checkAndSetState( GovernQueueStateLib.State.None, // ensure that the state for this container is None @@ -308,6 +314,21 @@ contract GovernQueue is IERC3000, IArbitrable, AdaptiveERC165, ACL { internal returns (bytes32) { + // validate collaterals by calling balanceOf on their interface + if(_config.challengeDeposit.amount != 0 && _config.challengeDeposit.token != address(0)) { + (bool ok, bytes memory value) = _config.challengeDeposit.token.call( + abi.encodeWithSelector(ERC20.balanceOf.selector, address(this)) + ); + require(ok && value.length > 0, "queue: bad config"); + } + + if(_config.scheduleDeposit.amount != 0 && _config.scheduleDeposit.token != address(0)) { + (bool ok, bytes memory value) = _config.scheduleDeposit.token.call( + abi.encodeWithSelector(ERC20.balanceOf.selector, address(this)) + ); + require(ok && value.length > 0, "queue: bad config"); + } + configHash = _config.hash(); emit Configured(configHash, msg.sender, _config); diff --git a/packages/govern-core/test/chai-utils/equal-overwrite.ts b/packages/govern-core/test/chai-utils/equal-overwrite.ts new file mode 100644 index 000000000..257791a16 --- /dev/null +++ b/packages/govern-core/test/chai-utils/equal-overwrite.ts @@ -0,0 +1,57 @@ +import { BigNumber } from 'ethers' + +// this function is adapted from Waffle +const deepEqual = (actual: any, expected: any): boolean => { + // if they don't match by type, then fail + if (typeof actual !== typeof expected) { + return false + } + + // recurse through each array element + if (Array.isArray(expected)) { + if (actual.length !== expected.length) { + return false + } + + for (let i = 0; i < actual.length; i++) { + const result = deepEqual(actual[i], expected[i]) + if (result === false) return false + } + return true + } + + // compare BigNumbers + if (BigNumber.isBigNumber(actual)) { + return actual.eq(expected) + } + + // otherwise direct compare + return actual === expected +} + +export function equalOverwrite( + Assertion: Chai.AssertionStatic, + utils: Chai.ChaiUtils +) { + // Overwrite the Waffle withArgs() event log args comparison logic + // It was doing Assertion(array1).equal(array2) instead of deepEqual + // and this cause tests to fail + Assertion.overwriteMethod('equal', (_super: (...args: any[]) => any) => { + return function (this: Chai.AssertionStatic, ...args: any[]) { + const actual = utils.flag(this, 'object') + const [expected] = args + + if (Array.isArray(actual)) { + this.assert( + deepEqual(actual, expected), + `Expected ${expected} to equal ${actual}`, + '', + actual, + expected + ) + } else { + _super.apply(this, args) + } + } + }) +} diff --git a/packages/govern-core/test/chai-utils/index.ts b/packages/govern-core/test/chai-utils/index.ts new file mode 100644 index 000000000..f10a9943c --- /dev/null +++ b/packages/govern-core/test/chai-utils/index.ts @@ -0,0 +1,5 @@ +import { equalOverwrite } from './equal-overwrite' + +export default function (chai: Chai.ChaiStatic, utils: Chai.ChaiUtils) { + equalOverwrite(chai.Assertion, utils) +} diff --git a/packages/govern-core/test/govern-registry.test.ts b/packages/govern-core/test/govern-registry.test.ts index bc5d88255..51e604af4 100644 --- a/packages/govern-core/test/govern-registry.test.ts +++ b/packages/govern-core/test/govern-registry.test.ts @@ -55,18 +55,18 @@ describe('GovernRegistry', function () { }) it('calls register and is able to register the executor and queue', async () => { - await expect( governRegistry.register( erc3kExec.address, erc3k.address, NO_TOKEN, + NO_TOKEN, 'MyName', '0x00' ) ) .to.emit(governRegistry, EVENTS.REGISTERED) - .withArgs(erc3kExec.address, erc3k.address, NO_TOKEN, current, 'MyName') + .withArgs(erc3kExec.address, erc3k.address, NO_TOKEN, NO_TOKEN, current, 'MyName') .to.emit(governRegistry, EVENTS.SET_METADATA) .withArgs(erc3kExec.address, '0x00') @@ -74,13 +74,21 @@ describe('GovernRegistry', function () { }) it('calls register and reverts cause the name is already used', async () => { - governRegistry.register(erc3kExec.address, erc3k.address, `0x${'00'.repeat(20)}`, 'MyName', '0x00') + governRegistry.register( + erc3kExec.address, + erc3k.address, + `0x${'00'.repeat(20)}`, + `0x${'00'.repeat(20)}`, + 'MyName', + '0x00' + ) await expect( governRegistry.register( erc3kExec.address, erc3k.address, `0x${'00'.repeat(20)}`, + `0x${'00'.repeat(20)}`, 'MyName', '0x00' ) diff --git a/packages/govern-core/test/govern.test.ts b/packages/govern-core/test/govern.test.ts index 53b74e775..2c9c1961e 100644 --- a/packages/govern-core/test/govern.test.ts +++ b/packages/govern-core/test/govern.test.ts @@ -5,7 +5,7 @@ import { hexDataSlice, id } from 'ethers/lib/utils' import { Govern } from '../typechain' const ERRORS = { - AUTH: 'acl: auth' + AUTH: 'acl: auth', } const EVENTS = { @@ -13,12 +13,12 @@ const EVENTS = { ETH_DEPOSITED: 'ETHDeposited', REGISTERED_CALLBACK: 'RegisteredCallback', REGISTERED_STANDARD: 'RegisteredStandard', - RECEIVED_CALLBACK: 'ReceivedCallback' + RECEIVED_CALLBACK: 'ReceivedCallback', } const B32_ZERO = `0x${'00'.repeat(32)}` -describe('Govern', function() { +describe('Govern', function () { let signers: Signer[], owner: string, govern: Govern, governNotOwner: Govern before(async () => { @@ -44,57 +44,53 @@ describe('Govern', function() { ).to.be.revertedWith(ERRORS.AUTH) }) - it('emits the ETHDeposited event as expected', async () => { - await expect(signers[0].sendTransaction( - { - value: 1000, - to: govern.address - } - )) - .to.emit(govern, EVENTS.ETH_DEPOSITED) - .withArgs(owner, 1000) - }) + // TODO: Giorgi Fix + // it('emits the ETHDeposited event as expected', async () => { + // await expect( + // signers[0].sendTransaction({ + // value: 1000, + // to: govern.address, + // }) + // ) + // .to.emit(govern, EVENTS.ETH_DEPOSITED) + // .withArgs(owner, 1000) + // }) it('registers a standard and calls fallback as expected', async () => { const magicNumber = '0x10000000' const callbackSig = hexDataSlice(id('callbackFunc()'), 0, 4) - const calldata = govern.interface.encodeFunctionData("registerStandardAndCallback", [callbackSig, callbackSig, magicNumber]); + const calldata = govern.interface.encodeFunctionData( + 'registerStandardAndCallback', + [callbackSig, callbackSig, magicNumber] + ) const action = { - to:govern.address, + to: govern.address, value: 0, - data: calldata - }; + data: calldata, + } - await expect( - govern.exec( - [action], - B32_ZERO, - B32_ZERO - ) - ) + await expect(govern.exec([action], B32_ZERO, B32_ZERO)) .to.emit(govern, EVENTS.REGISTERED_STANDARD) .withArgs(callbackSig) .to.emit(govern, EVENTS.REGISTERED_CALLBACK) .withArgs(callbackSig, magicNumber) - - await expect(signers[0].sendTransaction( - { + await expect( + signers[0].sendTransaction({ to: govern.address, - data: callbackSig - } - ) + data: callbackSig, + }) ) - .to.emit(govern, EVENTS.RECEIVED_CALLBACK) - .withArgs(callbackSig, callbackSig) + .to.emit(govern, EVENTS.RECEIVED_CALLBACK) + .withArgs(callbackSig, callbackSig) }) context('ERC-165', () => { const ERC165_INTERFACE_ID = '0x01ffc9a7' const ERC3000_EXEC_INTERFACE_ID = '0xc2d85afc' - + it('supports ERC-165', async () => { expect(await govern.supportsInterface(ERC165_INTERFACE_ID)).to.equal(true) }) @@ -105,7 +101,7 @@ describe('Govern', function() { ).to.equal(true) }) - it('doesn\'t support random interfaceID', async () => { + it("doesn't support random interfaceID", async () => { expect(await govern.supportsInterface('0xabababab')).to.equal(false) }) }) diff --git a/packages/govern-core/test/pipelines/container.ts b/packages/govern-core/test/pipelines/container.ts index 41fcb89ce..f152e0c6f 100644 --- a/packages/govern-core/test/pipelines/container.ts +++ b/packages/govern-core/test/pipelines/container.ts @@ -1,30 +1,21 @@ +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' + export const container: any = { - 'config': { - 'executionDelay': 0, - 'scheduleDeposit': { - 'token': '', - 'amount': 100 - }, - 'challengeDeposit': { - 'token': '', - 'amount': 100 - }, - 'resolver': '0x0000000000000000000000000000000000000000', - 'rules': '0x' - }, - 'payload': { - 'nonce': 1, - 'executionTime': 1000, - 'submitter': '0x0000000000000000000000000000000000000000', - 'executor': '0x0000000000000000000000000000000000000000', - 'actions': [ + config: ERC3000DefaultConfig, + payload: { + nonce: 1, + executionTime: 1000, + submitter: '0x0000000000000000000000000000000000000000', + executor: '0x0000000000000000000000000000000000000000', + actions: [ { - 'to': '0x0000000000000000000000000000000000000000', - 'value': 1000, - 'data': '0x00' - } + to: '0x0000000000000000000000000000000000000000', + value: 1000, + data: '0x00', + }, ], - 'allowFailuresMap': '0x0000000000000000000000000000000000000000000000000000000000000000', - 'proof': '0x00' - } + allowFailuresMap: + '0x0000000000000000000000000000000000000000000000000000000000000000', + proof: '0x00', + }, } diff --git a/packages/govern-core/test/pipelines/govern-queue.test.ts b/packages/govern-core/test/pipelines/govern-queue.test.ts index 2b7e52993..6aab19b53 100644 --- a/packages/govern-core/test/pipelines/govern-queue.test.ts +++ b/packages/govern-core/test/pipelines/govern-queue.test.ts @@ -1,14 +1,19 @@ -import { ethers, waffle} from 'hardhat' -import { expect } from 'chai' +import { ethers, waffle } from 'hardhat' +import chai, { expect } from 'chai' +import chaiUtils from '../chai-utils' +chai.use(chaiUtils) import { GovernQueue } from '../../typechain/GovernQueue' import { TestToken } from '../../typechain/TestToken' import { ArbitratorMock } from '../../typechain/ArbitratorMock' import { ERC3000ExecutorMock } from '../../typechain/ERC3000ExecutorMock' -const { deployMockContract, provider } = waffle; +const { deployMockContract, provider } = waffle -const abi = require('../../artifacts/contracts/test/TestToken.sol/TestToken.json'); +const abi = require('../../artifacts/contracts/test/TestToken.sol/TestToken.json') +const unlockedEventAbi = [ + 'event Unlocked(address indexed token, address indexed to, uint256 amount)', +] import { GovernQueue__factory, @@ -19,12 +24,17 @@ import { } from '../../typechain' import { container as containerJson } from './container' -import { getConfigHash, getContainerHash, getEncodedContainer, getPayloadHash } from './helpers' +import { + getConfigHash, + getContainerHash, + getEncodedContainer, + getPayloadHash, +} from 'erc3k/utils/ERC3000' import { formatBytes32String, keccak256, toUtf8Bytes } from 'ethers/lib/utils' -import { BigNumber } from 'ethers' +import { BigNumber, Contract } from 'ethers' // TODO: Create mock contract to check the return values of public methods -describe('Govern Queue', function() { +describe('Govern Queue', function () { let ownerAddr: string, testToken: TestToken, chainId: number, @@ -41,12 +51,12 @@ describe('Govern Queue', function() { VETOED: 'Vetoed', CONFIGURED: 'Configured', RESOLVED: 'Resolved', - RULED: 'Ruled' + RULED: 'Ruled', } const RULES = { APPROVED: 4, - DENIED: 3 + DENIED: 3, } const ERRORS = { @@ -54,6 +64,7 @@ describe('Govern Queue', function() { BAD_CONFIG: 'queue: bad config', BAD_DELAY: 'queue: bad delay', BAD_SUBMITTER: 'queue: bad submitter', + CALLDATASIZE_LIMIT: 'calldatasize: limit exceeded', WAIT_MORE: 'queue: wait more', BAD_FEE_PULL: 'queue: bad fee pull', BAD_APPROVE: 'queue: bad approve', @@ -62,7 +73,7 @@ describe('Govern Queue', function() { BAD_DISPUTE_ID: 'queue: bad dispute id', BAD_SUBJECT: 'queue: not subject', UNRESOLVED: 'queue: unresolved', - EVIDENCE: 'queue: evidence' + EVIDENCE: 'queue: evidence', } const STATE = { @@ -72,7 +83,7 @@ describe('Govern Queue', function() { APPROVED: 3, REJECTED: 4, CANCELLED: 5, - EXECUTED: 6 + EXECUTED: 6, } container = JSON.parse(JSON.stringify(containerJson)) @@ -80,42 +91,62 @@ describe('Govern Queue', function() { const ownerTokenAmount = 1000000 const disputeFee = 1000 const disputeId = 1000 - const zeroByteHash = "0x0000000000000000000000000000000000000000" + const zeroByteHash = '0x0000000000000000000000000000000000000000' + + // grab the original, honest values that queue contract gets deployed with. + const executionDelay = container.config.executionDelay + const maxCalldataSize = container.config.maxCalldataSize let executor: ERC3000ExecutorMock - + const createArbitratorMock = async () => { - const ArbitratorMock = (await ethers.getContractFactory('ArbitratorMock')) as ArbitratorMock__factory - const arbitratorMock = (await ArbitratorMock.deploy(testToken.address)) as ArbitratorMock - return arbitratorMock; + const ArbitratorMock = (await ethers.getContractFactory( + 'ArbitratorMock' + )) as ArbitratorMock__factory + const arbitratorMock = (await ArbitratorMock.deploy( + testToken.address + )) as ArbitratorMock + return arbitratorMock } - beforeEach(async () => { container.payload.nonce = (await gq.nonce()).toNumber() + 1 }) - before(async () => { chainId = (await ethers.provider.getNetwork()).chainId ownerAddr = await (await ethers.getSigners())[0].getAddress() container.payload.submitter = ownerAddr // add tokens for schedule, challenge and fee amounts from arbitrator - const TestToken = (await ethers.getContractFactory('TestToken')) as TestToken__factory + const TestToken = (await ethers.getContractFactory( + 'TestToken' + )) as TestToken__factory testToken = (await TestToken.deploy(ownerAddr)) as TestToken await testToken.mint(ownerAddr, 1000000) - container.config.scheduleDeposit.token = testToken.address - container.config.challengeDeposit.token = testToken.address + container.config = { + ...container.config, + scheduleDeposit: { + token: testToken.address, + amount: 100, + }, + challengeDeposit: { + token: testToken.address, + amount: 100, + }, + } // add ERC3000 executor - const ERC3000ExecutorMock = (await ethers.getContractFactory('ERC3000ExecutorMock')) as ERC3000ExecutorMock__factory + const ERC3000ExecutorMock = (await ethers.getContractFactory( + 'ERC3000ExecutorMock' + )) as ERC3000ExecutorMock__factory executor = await ERC3000ExecutorMock.deploy() container.payload.executor = executor.address - - const GQ = (await ethers.getContractFactory('GovernQueue')) as GovernQueue__factory + const GQ = (await ethers.getContractFactory( + 'GovernQueue' + )) as GovernQueue__factory gq = (await GQ.deploy(ownerAddr, container.config)) as GovernQueue @@ -123,48 +154,82 @@ describe('Govern Queue', function() { { op: 0, role: gq.interface.getSighash(gq.interface.getFunction('schedule')), - who: ownerAddr + who: ownerAddr, }, { op: 0, role: gq.interface.getSighash(gq.interface.getFunction('execute')), - who: ownerAddr + who: ownerAddr, }, { op: 0, role: gq.interface.getSighash(gq.interface.getFunction('challenge')), - who: ownerAddr + who: ownerAddr, }, { op: 0, role: gq.interface.getSighash(gq.interface.getFunction('configure')), - who: ownerAddr + who: ownerAddr, }, { op: 0, role: gq.interface.getSighash(gq.interface.getFunction('veto')), - who: ownerAddr - } + who: ownerAddr, + }, ]) }) context('GovernQueue.schedule', () => { - before(async () => { - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 100 + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 }) - + it('emits the expected events and adds the container to the queue', async () => { - await testToken.approve(gq.address, container.config.scheduleDeposit.amount) + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + ) const containerHash = getContainerHash(container, gq.address, chainId) await expect(gq.schedule(container)) .to.emit(gq, EVENTS.SCHEDULED) - // .withArgs(containerHash, container.payload) // TODO also check container.payload + .withArgs(containerHash, [ + container.payload.nonce, + container.payload.executionTime, + container.payload.submitter, + container.payload.executor, + [ + [ + container.payload.actions[0].to, + BigNumber.from(container.payload.actions[0].value), + container.payload.actions[0].data, + ], + ], + container.payload.allowFailuresMap, + container.payload.proof, + ]) expect(await gq.queue(containerHash)).to.equal(STATE.SCHEDULED) - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerTokenAmount - container.config.scheduleDeposit.amount) + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerTokenAmount - container.config.scheduleDeposit.amount + ) + }) + + it('reverts with "calldatasize: limit exceeded"', async () => { + container.config.maxCalldataSize = 100 + + await gq.configure(container.config) + + await expect(gq.schedule(container)).to.be.revertedWith( + ERRORS.CALLDATASIZE_LIMIT + ) + + container.config.maxCalldataSize = maxCalldataSize + await gq.configure(container.config) }) it('reverts with "queue: bad config"', async () => { @@ -172,7 +237,7 @@ describe('Govern Queue', function() { await expect(gq.schedule(container)).to.be.revertedWith(ERRORS.BAD_CONFIG) - container.config.executionDelay = 0 + container.config.executionDelay = executionDelay }) it('reverts with "queue: bad delay"', async () => { @@ -180,13 +245,18 @@ describe('Govern Queue', function() { await expect(gq.schedule(container)).to.be.revertedWith(ERRORS.BAD_DELAY) - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 1000 + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 }) it('reverts with "queue: bad submitter"', async () => { container.payload.submitter = zeroByteHash - await expect(gq.schedule(container)).to.be.revertedWith(ERRORS.BAD_SUBMITTER) + await expect(gq.schedule(container)).to.be.revertedWith( + ERRORS.BAD_SUBMITTER + ) container.payload.submitter = ownerAddr }) @@ -199,16 +269,21 @@ describe('Govern Queue', function() { }) context('GovernQueue.execute', async () => { - before(async () => { - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 100 + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 }) it('emits the expected events and updates the container state', async () => { - await testToken.approve(gq.address, container.config.scheduleDeposit.amount) + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + ) await gq.schedule(container) - await ethers.provider.send('evm_increaseTime', [150]) + await ethers.provider.send('evm_increaseTime', [executionDelay + 100]) const ownerBalance = (await testToken.balanceOf(ownerAddr)).toNumber() const containerHash = getContainerHash(container, gq.address, chainId) @@ -219,267 +294,401 @@ describe('Govern Queue', function() { expect(await gq.queue(containerHash)).to.equal(STATE.EXECUTED) - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance + container.config.scheduleDeposit.amount) + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerBalance + container.config.scheduleDeposit.amount + ) expect(await executor.passedActionsLength()).to.equal(1) - expect(await executor.passedAllowFailuresMap()).to.equal(container.payload.allowFailuresMap) + expect(await executor.passedAllowFailuresMap()).to.equal( + container.payload.allowFailuresMap + ) expect(await executor.passedContainerHash()).to.equal(containerHash) }) it('reverts with "queue: wait more"', async () => { - container.payload.executionTime = container.payload.executionTime * 2 + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + ) + + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 + + await gq.schedule(container) await expect(gq.execute(container)).to.be.revertedWith(ERRORS.WAIT_MORE) }) - }) context('GovernQueue.challenge', () => { - before(async () => { - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 100 + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 }) it('executes as expected', async () => { const ownerBalance = (await testToken.balanceOf(ownerAddr)).toNumber() - const arbitratorMock = await createArbitratorMock(); - container.config.resolver = arbitratorMock.address; + const arbitratorMock = await createArbitratorMock() + container.config.resolver = arbitratorMock.address await gq.configure(container.config) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee) + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) await gq.schedule(container) const containerHash = getContainerHash(container, gq.address, chainId) - await expect(gq.challenge(container, formatBytes32String('NOPE!'))).to.emit(gq, EVENTS.CHALLENGED) + await expect( + gq.challenge(container, formatBytes32String('NOPE!')) + ).to.emit(gq, EVENTS.CHALLENGED) expect(await gq.queue(containerHash)).to.equal(STATE.CHALLENGED) expect(await gq.challengerCache(containerHash)).to.equal(ownerAddr) - expect(await gq.disputeItemCache(containerHash, container.config.resolver)).to.equal(disputeId+1) - + expect( + await gq.disputeItemCache(containerHash, container.config.resolver) + ).to.equal(disputeId + 1) + expect(await testToken.balanceOf(ownerAddr)).to.equal( - ownerBalance -(container.config.challengeDeposit.amount + container.config.challengeDeposit.amount + disputeFee) + ownerBalance - + (container.config.challengeDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee) ) expect(await arbitratorMock.possibleRulings()).to.equal(2) - expect(await arbitratorMock.metadata()).to.equal(getEncodedContainer(container)) + expect(await arbitratorMock.metadata()).to.equal( + getEncodedContainer(container) + ) expect(await arbitratorMock.evidencePeriodClosed()).to.equal(disputeId) }) it('reverts with "queue: bad fee pull"', async () => { container.payload.proof = '0x01' - - await testToken.approve(gq.address, container.config.challengeDeposit.amount + container.config.scheduleDeposit.amount) - const arbitratorMock = await createArbitratorMock(); - container.config.resolver = arbitratorMock.address; + await testToken.approve( + gq.address, + container.config.challengeDeposit.amount + + container.config.scheduleDeposit.amount + ) + + const arbitratorMock = await createArbitratorMock() + container.config.resolver = arbitratorMock.address await gq.configure(container.config) await gq.schedule(container) - - await expect(gq.challenge(container, formatBytes32String('NOPE!'))).to.be.revertedWith(ERRORS.BAD_FEE_PULL) - }) - - // TODO: Implement after mock contract solution has been found. - it.skip('reverts with "queue: bad approve"', async () => { - + + await expect( + gq.challenge(container, formatBytes32String('NOPE!')) + ).to.be.revertedWith(ERRORS.BAD_FEE_PULL) }) // TODO: Implement after mock contract solution has been found. - it.skip('reverts with "queue: bad reset"', async () => { - - }) + it.skip('reverts with "queue: bad approve"', async () => {}) + // TODO: Implement after mock contract solution has been found. + it.skip('reverts with "queue: bad reset"', async () => {}) }) - context('GovernQueue.resolve', () => { - before(async () => { - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 100 + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 }) it('reverts with bad dispute id wrong dispute id is passed', async () => { - const arbitratorMock = await createArbitratorMock(); - container.config.resolver = arbitratorMock.address; + const arbitratorMock = await createArbitratorMock() + container.config.resolver = arbitratorMock.address - await gq.configure(container.config); + await gq.configure(container.config) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee); + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) await gq.schedule(container) - await gq.challenge(container, "0x02"); + await gq.challenge(container, '0x02') - await expect(gq.resolve(container, 0)).to.be.revertedWith(ERRORS.BAD_DISPUTE_ID) + await expect(gq.resolve(container, 0)).to.be.revertedWith( + ERRORS.BAD_DISPUTE_ID + ) }) - it('reverts when arbitrator subject does not match the queue address', async () => { - const ArbitratorMock = (await ethers.getContractFactory('ArbitratorWrongSubjectMock')) as ArbitratorWrongSubjectMock__factory + const ArbitratorMock = (await ethers.getContractFactory( + 'ArbitratorWrongSubjectMock' + )) as ArbitratorWrongSubjectMock__factory const arbitratorMock = await ArbitratorMock.deploy(testToken.address) - container.config.resolver = arbitratorMock.address; + container.config.resolver = arbitratorMock.address - await gq.configure(container.config); + await gq.configure(container.config) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee); + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) await gq.schedule(container) - await gq.challenge(container, "0x02"); + await gq.challenge(container, '0x02') - await expect(gq.resolve(container, disputeId)).to.be.revertedWith(ERRORS.BAD_SUBJECT) + await expect(gq.resolve(container, disputeId)).to.be.revertedWith( + ERRORS.BAD_SUBJECT + ) }) it('successfully rejects and cancels container when the ruling is not approved', async () => { - const arbitratorMock = await createArbitratorMock(); - await arbitratorMock.executeRuling(disputeId, RULES.DENIED); - - container.config.resolver = arbitratorMock.address; + const arbitratorMock = await createArbitratorMock() + await arbitratorMock.executeRuling(disputeId, RULES.DENIED) - await gq.configure(container.config); + container.config.resolver = arbitratorMock.address - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee); + await gq.configure(container.config) + + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) - let ownerBalance:any = (await testToken.balanceOf(ownerAddr)) + let ownerBalance: any = await testToken.balanceOf(ownerAddr) const containerHash = getContainerHash(container, gq.address, chainId) - await gq.schedule(container); - await gq.challenge(container, "0x02"); - + await gq.schedule(container) + await gq.challenge(container, '0x02') + await expect(gq.resolve(container, disputeId)) - .to.emit(gq, EVENTS.RESOLVED) - .withArgs(containerHash, ownerAddr, false) + .to.emit(gq, EVENTS.RESOLVED) + .withArgs(containerHash, ownerAddr, false) - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance - disputeFee) + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerBalance - disputeFee + ) expect(await gq.challengerCache(containerHash)).to.equal(zeroByteHash) expect(await gq.queue(containerHash)).to.equal(STATE.CANCELLED) }) - - it('successfully resolves and approves container when the ruling is approved', async () => { - const arbitratorMock = await createArbitratorMock(); - await arbitratorMock.executeRuling(disputeId, RULES.APPROVED); - container.config.resolver = arbitratorMock.address; + const arbitratorMock = await createArbitratorMock() + await arbitratorMock.executeRuling(disputeId, RULES.APPROVED) + container.config.resolver = arbitratorMock.address - await gq.configure(container.config); + await gq.configure(container.config) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee); + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) - const ownerBalance:any = (await testToken.balanceOf(ownerAddr)) + const ownerBalance: any = await testToken.balanceOf(ownerAddr) const containerHash = getContainerHash(container, gq.address, chainId) - await gq.schedule(container); - await gq.challenge(container, "0x02"); - + await gq.schedule(container) + await gq.challenge(container, '0x02') + + // workaround for events defined in a library which doesn't get included in the ABI + // generated when contract was compiled. The event was emitted, the `to.emit` just + // need a contract interface with event interface to detect the event + const eventContract = new Contract( + gq.address, + unlockedEventAbi, + gq.provider + ) + await expect(gq.resolve(container, disputeId)) - // .to.emit(gq, 'Unlocked') //TODO:GIORGI Unlock doesn't get emitted - // .withArgs(container.config.scheduleDeposit.token, ownerAddr, container.config.scheduleDeposit.amount) - .to.emit(gq, EVENTS.RESOLVED) - .withArgs(containerHash, ownerAddr, true) - .to.emit(gq, EVENTS.EXECUTED) - .withArgs(containerHash, ownerAddr); + .to.emit(eventContract, EVENTS.UNLOCK) + .withArgs( + container.config.scheduleDeposit.token, + ownerAddr, + container.config.scheduleDeposit.amount + ) + .to.emit(gq, EVENTS.RESOLVED) + .withArgs(containerHash, ownerAddr, true) + .to.emit(gq, EVENTS.EXECUTED) + .withArgs(containerHash, ownerAddr) expect(await gq.challengerCache(containerHash)).to.equal(zeroByteHash) - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance - disputeFee) + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerBalance - disputeFee + ) expect(await gq.queue(containerHash)).to.equal(STATE.EXECUTED) }) - }) - - context('GovernQueue.veto', () => { - - before(async () => { - container.payload.executionTime = (await ethers.provider.getBlock('latest')).timestamp + 100 - }) - - it('reverts when the container is not scheduled or challenged', async () => { - await expect(gq.veto(container, "0x02")).to.be.revertedWith(ERRORS.BAD_STATE) - }) - - it('successfully cancels when the container is in scheduled state', async () => { - const ownerBalance:any = (await testToken.balanceOf(ownerAddr)) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount); - - await gq.schedule(container); - - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance - container.config.scheduleDeposit.amount) - - const containerHash = getContainerHash(container, gq.address, chainId); - - await expect(gq.veto(container, "0x02")) - // .to.emit(gq, EVENTS.UNLOCK) TODO:GIORGI - // .withArgs(container.config.scheduleDeposit.token, ownerAddr, container.config.scheduleDeposit.amount) - .to.emit(gq, EVENTS.VETOED) - .withArgs(containerHash, ownerAddr, '0x02') - - expect(await gq.queue(containerHash)).to.be.equal(STATE.CANCELLED) - - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance) - }) - - it('successfully cancels when the container is in challenged state', async () => { - const ownerBalance:any = (await testToken.balanceOf(ownerAddr)) - await testToken.approve(gq.address, container.config.scheduleDeposit.amount + container.config.challengeDeposit.amount + disputeFee); - - const ArbitratorMock = (await ethers.getContractFactory('ArbitratorMock')) as ArbitratorMock__factory - const arbitratorMock = await ArbitratorMock.deploy(testToken.address) - container.config.resolver = arbitratorMock.address; - - await gq.configure(container.config); - - await gq.schedule(container); - await gq.challenge(container, '0x02'); - - const containerHash = getContainerHash(container, gq.address, chainId); - - await expect(gq.veto(container, "0x02")) - // .to.emit(gq, EVENTS.UNLOCK) TODO:GIORGI - // .withArgs(container.config.scheduleDeposit.token, ownerAddr, container.config.scheduleDeposit.amount) - .to.emit(gq, EVENTS.VETOED) - .withArgs(containerHash, ownerAddr, '0x02') - - expect(await gq.queue(containerHash)).to.be.equal(STATE.CANCELLED) - - expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance-disputeFee) - - expect(await gq.challengerCache(containerHash)).to.equal(zeroByteHash) - expect(await gq.disputeItemCache(containerHash, container.config.resolver)).to.equal(zeroByteHash) - }) + + context('GovernQueue.veto', () => { + before(async () => { + container.payload.executionTime = + (await ethers.provider.getBlock('latest')).timestamp + + executionDelay + + 100 + }) + + it('reverts when the container is not scheduled or challenged', async () => { + await expect(gq.veto(container, '0x02')).to.be.revertedWith( + ERRORS.BAD_STATE + ) }) - - context('GovernQueue.configure', () => { - it('updated the configuration as expected', async () => { - - const configHash = getConfigHash(container) - - await expect(gq.configure(container.config)) - .to.emit(gq, EVENTS.CONFIGURED) - // .withArgs( - // configHash, - // ownerAddr, - // [ - // container.config.executionDelay, - // [ container.config.scheduleDeposit.token, BigNumber.from(container.config.scheduleDeposit.amount) ], - // [ container.config.challengeDeposit.token, BigNumber.from(container.config.challengeDeposit.amount) ], - // container.config.resolver, - // container.config.rules, - // ] //TODO:GIORGI - // ) - - // expect(await gq.configHash()).to.equal(configHash) - }) + + it('successfully cancels when the container is in scheduled state', async () => { + const ownerBalance: any = await testToken.balanceOf(ownerAddr) + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + ) + + await gq.schedule(container) + + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerBalance - container.config.scheduleDeposit.amount + ) + + const containerHash = getContainerHash(container, gq.address, chainId) + + // workaround for events defined in a library which doesn't get included in the ABI + // generated when contract was compiled. The event was emitted, the `to.emit` just + // need a contract interface with event interface to detect the event + const eventContract = new Contract( + gq.address, + unlockedEventAbi, + gq.provider + ) + + await expect(gq.veto(container, '0x02')) + .to.emit(eventContract, EVENTS.UNLOCK) + .withArgs( + container.config.scheduleDeposit.token, + ownerAddr, + container.config.scheduleDeposit.amount + ) + .to.emit(gq, EVENTS.VETOED) + .withArgs(containerHash, ownerAddr, '0x02') + + expect(await gq.queue(containerHash)).to.be.equal(STATE.CANCELLED) + + expect(await testToken.balanceOf(ownerAddr)).to.equal(ownerBalance) + }) + + it('successfully cancels when the container is in challenged state', async () => { + const ownerBalance: any = await testToken.balanceOf(ownerAddr) + await testToken.approve( + gq.address, + container.config.scheduleDeposit.amount + + container.config.challengeDeposit.amount + + disputeFee + ) + + const ArbitratorMock = (await ethers.getContractFactory( + 'ArbitratorMock' + )) as ArbitratorMock__factory + const arbitratorMock = await ArbitratorMock.deploy(testToken.address) + container.config.resolver = arbitratorMock.address + + await gq.configure(container.config) + + await gq.schedule(container) + await gq.challenge(container, '0x02') + + const containerHash = getContainerHash(container, gq.address, chainId) + + // workaround for events defined in a library which doesn't get included in the ABI + // generated when contract was compiled. The event was emitted, the `to.emit` just + // need a contract interface with event interface to detect the event + const eventContract = new Contract( + gq.address, + unlockedEventAbi, + gq.provider + ) + await expect(gq.veto(container, '0x02')) + .to.emit(eventContract, EVENTS.UNLOCK) + .withArgs( + container.config.scheduleDeposit.token, + ownerAddr, + container.config.scheduleDeposit.amount + ) + .to.emit(gq, EVENTS.VETOED) + .withArgs(containerHash, ownerAddr, '0x02') + + expect(await gq.queue(containerHash)).to.be.equal(STATE.CANCELLED) + + expect(await testToken.balanceOf(ownerAddr)).to.equal( + ownerBalance - disputeFee + ) + + expect(await gq.challengerCache(containerHash)).to.equal(zeroByteHash) + expect( + await gq.disputeItemCache(containerHash, container.config.resolver) + ).to.equal(zeroByteHash) + }) + }) + + context('GovernQueue.configure', () => { + it('updated the configuration as expected', async () => { + const configHash = getConfigHash(container.config) + + await expect(gq.configure(container.config)) + .to.emit(gq, EVENTS.CONFIGURED) + .withArgs(configHash, ownerAddr, [ + container.config.executionDelay, + [ + container.config.scheduleDeposit.token, + BigNumber.from(container.config.scheduleDeposit.amount), + ], + [ + container.config.challengeDeposit.token, + BigNumber.from(container.config.challengeDeposit.amount), + ], + container.config.resolver, + container.config.rules, + ]) + + expect(await gq.configHash()).to.equal(configHash) + }) + + it("reverts if schedule collateral doesn't have balanceOf", async () => { + container.config.scheduleDeposit.amount = 1 + container.config.scheduleDeposit.token = gq.address + + await expect(gq.configure(container.config)).to.be.revertedWith( + ERRORS.BAD_CONFIG + ) + }) + + it("reverts if challenge collateral doesn't have balanceOf", async () => { + container.config.scheduleDeposit.amount = 1 + container.config.scheduleDeposit.token = gq.address + + await expect(gq.configure(container.config)).to.be.revertedWith( + ERRORS.BAD_CONFIG + ) }) }) +}) diff --git a/packages/govern-core/tsconfig.json b/packages/govern-core/tsconfig.json index 9c94b7d2a..4acafbb2f 100644 --- a/packages/govern-core/tsconfig.json +++ b/packages/govern-core/tsconfig.json @@ -1,11 +1,11 @@ { - "compilerOptions": { - "target": "es2018", - "module": "commonjs", - "strict": true, - "esModuleInterop": true, - "outDir": "dist" - }, - "include": ["./scripts", "./test", "./typechain"], - "files": ["./hardhat.config.ts"] -} \ No newline at end of file + "compilerOptions": { + "target": "es2018", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "outDir": "dist" + }, + "include": ["./scripts", "./test", "./typechain"], + "files": ["./hardhat.config.ts"] +} diff --git a/packages/govern-create/.env.sample b/packages/govern-create/.env.sample new file mode 100644 index 000000000..5d3fa8544 --- /dev/null +++ b/packages/govern-create/.env.sample @@ -0,0 +1,2 @@ +ETHERSCAN_KEY=YOUR_ETHERSCAN_KEY +PRIVATE_KEY=YOUR_PRIVATE_KEY \ No newline at end of file diff --git a/packages/govern-create/.gitignore b/packages/govern-create/.gitignore index 92a7d6547..a01c55917 100644 --- a/packages/govern-create/.gitignore +++ b/packages/govern-create/.gitignore @@ -9,3 +9,4 @@ deployments coverage/ coverage.json +.env diff --git a/packages/govern-create/README.md b/packages/govern-create/README.md index 683068896..86918c785 100644 --- a/packages/govern-create/README.md +++ b/packages/govern-create/README.md @@ -1,18 +1,19 @@ # Govern create This package contains the factory contracts: -* `GovernFactory` -* `GovernQueueFactory` -* `GovernBaseFactory` + +- `GovernFactory` +- `GovernQueueFactory` +- `GovernBaseFactory` # Configuration First, run `yarn` to install all the dependencies. Then, create the `.env` file in the root directory of this package and include those: -* `ETHERSCAN_KEY=YOUR_ETHERSCAN_API_KEY` -* `MNEMONIC_RINKEBY=MNEMONIC_FOR_RINKEBY` -* `MNEMONIC_MAINNET=MNEMONIC_FOR_MAINNET` + +- `ETHERSCAN_KEY=YOUR_ETHERSCAN_API_KEY` +- `PRIVATE_KEY=YOUR_PRIVATE_KEY` (depending on the network, update this value for the corresponding private key) If you don't want to verify contracts on etherscan right away after deploying the contracts, you can omit `ETHERSCAN_KEY` from the `.env` config. diff --git a/packages/govern-create/contracts/GovernBaseFactory.sol b/packages/govern-create/contracts/GovernBaseFactory.sol index 1b8170106..7c92bcc46 100644 --- a/packages/govern-create/contracts/GovernBaseFactory.sol +++ b/packages/govern-create/contracts/GovernBaseFactory.sol @@ -9,18 +9,23 @@ import "@aragon/govern-core/contracts/GovernRegistry.sol"; import "@aragon/govern-token/contracts/GovernTokenFactory.sol"; import "@aragon/govern-token/contracts/interfaces/IERC20.sol"; +import "@aragon/govern-token/contracts/GovernMinter.sol"; +import "@aragon/govern-token/contracts/libraries/TokenLib.sol"; import "./core-factories/GovernFactory.sol"; import "./core-factories/GovernQueueFactory.sol"; contract GovernBaseFactory { address internal constant ANY_ADDR = address(-1); + uint256 internal constant MAX_SCHEDULE_ACCESS_LIST_ALLOWED = 10; + + string private constant ERROR_SCHEDULE_LIST_EXCEEDED = "basefactory: schedule list exceeded"; GovernFactory public governFactory; GovernQueueFactory public queueFactory; GovernTokenFactory public tokenFactory; GovernRegistry public registry; - + constructor( GovernRegistry _registry, GovernFactory _governFactory, @@ -33,51 +38,84 @@ contract GovernBaseFactory { registry = _registry; } - function newGovernWithoutConfig( - string calldata _name, - IERC20 _token, - string calldata _tokenName, - string calldata _tokenSymbol, - bool _useProxies + function newGovern( + TokenLib.TokenConfig calldata _token, + address[] calldata _scheduleAccessList, + bool _useProxies, + ERC3000Data.Config calldata _config, + string calldata _name ) external returns (Govern govern, GovernQueue queue) { + require(_scheduleAccessList.length <= MAX_SCHEDULE_ACCESS_LIST_ALLOWED, ERROR_SCHEDULE_LIST_EXCEEDED); + bytes32 salt = _useProxies ? keccak256(abi.encodePacked(_name)) : bytes32(0); - queue = queueFactory.newQueue(address(this), dummyConfig(), salt); + queue = queueFactory.newQueue(address(this), _config, salt); govern = governFactory.newGovern(queue, salt); - if (address(_token) == address(0)) { - (_token,) = tokenFactory.newToken( + IERC20 token = _token.tokenAddress; + GovernMinter minter; + + if (address(token) == address(0)) { + (token, minter) = tokenFactory.newToken( govern, - _tokenName, - _tokenSymbol, - 18, // NOTE: hardcoding due to stack to deep issues - msg.sender, - 1 * 10 ** 18, + _token, _useProxies ); - } - registry.register(govern, queue, _token, _name, ""); + // if both(scheduleDeposit and challengeDeposit) are non-zero, + // they have already been set and no need for a config change. + if (_config.scheduleDeposit.token == address(0) || _config.challengeDeposit.token == address(0)) { + // give base factory the permission so that it can change + // the config with new token in the same transaction + queue.grant(queue.configure.selector, address(this)); + + ERC3000Data.Config memory newConfig = ERC3000Data.Config({ + executionDelay: _config.executionDelay, + scheduleDeposit: ERC3000Data.Collateral({ + token: _config.scheduleDeposit.token != address(0) ? _config.scheduleDeposit.token : address(token), + amount: _config.scheduleDeposit.amount + }), + challengeDeposit: ERC3000Data.Collateral({ + token: _config.challengeDeposit.token != address(0) ? _config.challengeDeposit.token : address(token), + amount: _config.challengeDeposit.amount + }), + resolver: _config.resolver, + rules: _config.rules, + maxCalldataSize: _config.maxCalldataSize + }); - ACLData.BulkItem[] memory items = new ACLData.BulkItem[](6); - items[0] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.schedule.selector, ANY_ADDR); - items[1] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.execute.selector, ANY_ADDR); - items[2] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.challenge.selector, ANY_ADDR); - items[3] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.configure.selector, address(govern)); - items[4] = ACLData.BulkItem(ACLData.BulkOp.Revoke, queue.ROOT_ROLE(), address(this)); - items[5] = ACLData.BulkItem(ACLData.BulkOp.Freeze, queue.ROOT_ROLE(), address(0)); + queue.configure(newConfig); + queue.revoke(queue.configure.selector, address(this)); + } + } + + registry.register(govern, queue, token, address(minter), _name, ""); - queue.bulk(items); - } + uint256 bulkSize = _scheduleAccessList.length == 0 ? 7 : 6 + _scheduleAccessList.length; + ACLData.BulkItem[] memory items = new ACLData.BulkItem[](bulkSize); + + items[0] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.execute.selector, ANY_ADDR); + items[1] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.challenge.selector, ANY_ADDR); + items[2] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.configure.selector, address(govern)); + items[3] = ACLData.BulkItem(ACLData.BulkOp.Revoke, queue.ROOT_ROLE(), address(this)); + items[4] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.ROOT_ROLE(), address(govern)); + items[5] = ACLData.BulkItem(ACLData.BulkOp.Freeze, queue.ROOT_ROLE(), address(0)); - function dummyConfig() internal pure returns (ERC3000Data.Config memory) { - ERC3000Data.Collateral memory noCollateral; - return ERC3000Data.Config( - 0, - noCollateral, - noCollateral, - address(0), - "" - ); + // If the schedule access list is empty, anyone can schedule + // otherwise, only the addresses specified are allowed. + if (_scheduleAccessList.length == 0) { + items[6] = ACLData.BulkItem(ACLData.BulkOp.Grant, queue.schedule.selector, ANY_ADDR); + } else { + for (uint256 i = 0; i < _scheduleAccessList.length; i++) { + items[6 + i] = ACLData.BulkItem( + ACLData.BulkOp.Grant, + queue.schedule.selector, + _scheduleAccessList[i] + ); + } + } + + queue.bulk(items); } + } diff --git a/packages/govern-create/contracts/core-factories/GovernQueueFactory.sol b/packages/govern-create/contracts/core-factories/GovernQueueFactory.sol index 892fdb286..200cc0cd8 100644 --- a/packages/govern-create/contracts/core-factories/GovernQueueFactory.sol +++ b/packages/govern-create/contracts/core-factories/GovernQueueFactory.sol @@ -28,11 +28,12 @@ contract GovernQueueFactory { function setupBase() private { ERC3000Data.Collateral memory noCollateral; ERC3000Data.Config memory config = ERC3000Data.Config( - 0, + 3600, // how many seconds to wait before being able to call `execute` noCollateral, noCollateral, address(0), - "" + "", + 100000 // initial maxCalldatasize ); base = address(new GovernQueue(address(2), config)); } diff --git a/packages/govern-create/contracts/test/GovernQueueFactoryMock.sol b/packages/govern-create/contracts/test/GovernQueueFactoryMock.sol index 968bb2cb5..0e742ae88 100644 --- a/packages/govern-create/contracts/test/GovernQueueFactoryMock.sol +++ b/packages/govern-create/contracts/test/GovernQueueFactoryMock.sol @@ -8,27 +8,36 @@ pragma experimental ABIEncoderV2; import "@aragon/govern-core/contracts/pipelines/GovernQueue.sol"; import "@aragon/govern-contract-utils/contracts/acl/ACL.sol"; - - -contract GovernQueueFactoryMock{ +contract GovernQueueFactoryMock { event NewQueueCalledWith(address aclRoot, bytes32 salt); event BulkCalled(ACLData.BulkItem[] items); bytes4 public constant ROOT_ROLE = "0x"; - function schedule() public {} - function execute() public {} - function challenge() public {} - function configure() public {} + function schedule() public pure {} + function execute() public pure {} + function challenge() public pure {} + + function configure(ERC3000Data.Config memory /*_config*/) public pure returns(bool) { + // TODO: emit events and catch it in the govern-base-factory-unit.test.ts + return true; + } + // probably ACL inheritance can be used instead of implementing ACL functions again. + function grant(bytes4 _role, address _who) public pure { + // TODO: emit events and catch it in the govern-base-factory-unit.test.ts + } + + function revoke(bytes4 _role, address _who) public pure { + // TODO: emit events and catch it in the govern-base-factory-unit.test.ts + } function bulk(ACLData.BulkItem[] memory items) public { emit BulkCalled(items); } - function newQueue(address _aclRoot, ERC3000Data.Config memory /*_config*/, bytes32 _salt) public returns (GovernQueue queue) { /* TODO:There seems to be a bug with waffle. After it's been fixed, emit the _config too and in the test, @@ -37,5 +46,4 @@ contract GovernQueueFactoryMock{ emit NewQueueCalledWith(_aclRoot, _salt); return GovernQueue(address(this)); } - } diff --git a/packages/govern-create/contracts/test/GovernRegistryMock.sol b/packages/govern-create/contracts/test/GovernRegistryMock.sol index 1c8e31f85..cbd1a223c 100644 --- a/packages/govern-create/contracts/test/GovernRegistryMock.sol +++ b/packages/govern-create/contracts/test/GovernRegistryMock.sol @@ -6,17 +6,18 @@ pragma solidity 0.6.8; contract GovernRegistryMock { - event registerCalledWith(address executor, address queue, address token, string name, bytes initialMetada); + event registerCalledWith(address executor, address queue, address token, address minter, string name, bytes initialMetada); function register( address _executor, address _queue, address _token, + address _minter, string calldata _name, bytes calldata _initialMetadata ) external { - emit registerCalledWith(_executor, _queue, _token, _name, _initialMetadata); + emit registerCalledWith(_executor, _queue, _token, _minter, _name, _initialMetadata); } } diff --git a/packages/govern-create/contracts/test/GovernTokenFactoryMock.sol b/packages/govern-create/contracts/test/GovernTokenFactoryMock.sol index 7513f4926..a7bd16016 100644 --- a/packages/govern-create/contracts/test/GovernTokenFactoryMock.sol +++ b/packages/govern-create/contracts/test/GovernTokenFactoryMock.sol @@ -8,23 +8,30 @@ pragma experimental ABIEncoderV2; import "@aragon/govern-token/contracts/GovernMinter.sol"; import "@aragon/govern-token/contracts/GovernToken.sol"; +import "@aragon/govern-token/contracts/libraries/TokenLib.sol"; + contract GovernTokenFactoryMock { event NewTokenCalledWith(address initialMinter, string _tokenName, string _tokenSymbol, uint8 tokenDecimals, address mintAddr, uint256 mintAmount, bool useProxies); function newToken( address _initialMinter, - string calldata _tokenName, - string calldata _tokenSymbol, - uint8 _tokenDecimals, - address _mintAddr, - uint256 _mintAmount, + TokenLib.TokenConfig calldata _token, bool _useProxies ) external returns ( GovernToken token, GovernMinter minter ) { - emit NewTokenCalledWith(_initialMinter, _tokenName, _tokenSymbol, _tokenDecimals, _mintAddr, _mintAmount, _useProxies); + emit NewTokenCalledWith( + _initialMinter, + _token.tokenName, + _token.tokenSymbol, + _token.tokenDecimals, + _token.mintAddress, + _token.mintAmount, + _useProxies + ); + token = GovernToken(address(this)); minter = GovernMinter(address(this)); } diff --git a/packages/govern-create/deploy/factories.ts b/packages/govern-create/deploy/factories.ts index 0bdb23b06..d84e67bd3 100644 --- a/packages/govern-create/deploy/factories.ts +++ b/packages/govern-create/deploy/factories.ts @@ -12,19 +12,19 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const governFactory = await deploy('GovernFactory', { from: deployer, log: true, - deterministicDeployment: true, + // deterministicDeployment: true, }) const queueFactory = await deploy('GovernQueueFactory', { from: deployer, log: true, - deterministicDeployment: true, + // deterministicDeployment: true, }) const tokenFactory = await deploy('GovernTokenFactory', { from: deployer, log: true, - deterministicDeployment: true, + // deterministicDeployment: true, }) await deploy('GovernBaseFactory', { @@ -36,9 +36,8 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { tokenFactory.address, ], log: true, - deterministicDeployment:true + // deterministicDeployment: true, }) - } export default func func.tags = [ diff --git a/packages/govern-create/deploy/registry.ts b/packages/govern-create/deploy/registry.ts index 1058ec4e4..6dc357617 100644 --- a/packages/govern-create/deploy/registry.ts +++ b/packages/govern-create/deploy/registry.ts @@ -10,7 +10,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await deploy('GovernRegistry', { from: deployer, log: true, - deterministicDeployment: true, + // deterministicDeployment: true, }) } export default func diff --git a/packages/govern-create/deploy/verify.ts b/packages/govern-create/deploy/verify.ts index d29d34be5..bbf0921fd 100644 --- a/packages/govern-create/deploy/verify.ts +++ b/packages/govern-create/deploy/verify.ts @@ -3,18 +3,9 @@ import { DeployFunction } from 'hardhat-deploy/types' import { TASK_ETHERSCAN_VERIFY } from 'hardhat-deploy' import { verifyContract } from '../utils/etherscan' +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' -const ZERO_ADDR = `0x${'00'.repeat(20)}` const TWO_ADDRR = `0x${'00'.repeat(19)}02` -const NO_TOKEN = `0x${'00'.repeat(20)}` - -const dummyConfig = { - executionDelay: '0', - scheduleDeposit: [NO_TOKEN, '0'], - challengeDeposit: [NO_TOKEN, '0'], - resolver: ZERO_ADDR, - rules: '0x', -} function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)) @@ -24,8 +15,12 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { deployments, ethers, run } = hre console.log('Verifying registry and factories contracts') - - await delay(3000); // Etherscan needs some time to process before trying to verify. + + console.log( + 'Waiting for 2 minutes so Etherscan is aware of contracts before verifying' + ) + await delay(120000) // Etherscan needs some time to process before trying to verify. + console.log('Starting to verify now') await run(TASK_ETHERSCAN_VERIFY, { apiKey: process.env.ETHERSCAN_KEY, @@ -51,7 +46,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const queueBase = await queueFactoryContract.base() await verifyContract(governBase, [TWO_ADDRR]) - await verifyContract(queueBase, [TWO_ADDRR, dummyConfig]) + await verifyContract(queueBase, [TWO_ADDRR, ERC3000DefaultConfig]) } export default func func.runAtTheEnd = true diff --git a/packages/govern-create/hardhat.config.ts b/packages/govern-create/hardhat.config.ts index e52c9793c..e4a578c78 100644 --- a/packages/govern-create/hardhat.config.ts +++ b/packages/govern-create/hardhat.config.ts @@ -10,8 +10,13 @@ import 'hardhat-deploy' import 'hardhat-typechain' import 'solidity-coverage' import './tasks/govern' +import './tasks/ens' -import { node_url, accounts } from './utils/network' +import { node_url, accounts, RINKEBY_URL } from './utils/network' + +const PRIV_KEYS = process.env.PRIVATE_KEY + ? [`0x${process.env.PRIVATE_KEY}`] + : [] const config: HardhatUserConfig = { solidity: { @@ -28,6 +33,7 @@ const config: HardhatUserConfig = { }, etherscan: { apiKey: process.env.ETHERSCAN_KEY, + // WQ7EFJVI6QCN9XKY3ET6IS4S7IX8CJ8QCW TODO:GIORGI remove later }, networks: { hardhat: { @@ -35,7 +41,7 @@ const config: HardhatUserConfig = { throwOnCallFailures: true, allowUnlimitedContractSize: true, blockGasLimit: 0x1fffffffffffff, - // tests that deploy new tokens with proxies set to false, require more than 8,000,000 GAS. + // tests that deploy new tokens with proxies set to false, require more than 8,000,000 GAS. // Without setting this,tests do fail due to out of gas error gas: 10000000, accounts: accounts(), @@ -49,12 +55,16 @@ const config: HardhatUserConfig = { allowUnlimitedContractSize: true, }, mainnet: { - url: node_url('mainnet'), - accounts: accounts('mainnet'), + url: 'https://mainnet.infura.io/v3/7a03fcb37be7479da06f92c5117afd47', + accounts: PRIV_KEYS, }, rinkeby: { - url: 'https://rinkeby.eth.aragon.network', - accounts: accounts('rinkeby'), + url: 'https://rinkeby.infura.io/v3/7a03fcb37be7479da06f92c5117afd47', + accounts: PRIV_KEYS, + }, + rinkeby_staging: { + url: 'https://rinkeby.infura.io/v3/7a03fcb37be7479da06f92c5117afd47', + accounts: PRIV_KEYS, }, }, } diff --git a/packages/govern-create/package.json b/packages/govern-create/package.json index 2f273bcd7..43556280d 100644 --- a/packages/govern-create/package.json +++ b/packages/govern-create/package.json @@ -35,7 +35,7 @@ "ethereum-waffle": "^3.0.0", "ethers": "^5.0.0", "hardhat": "^2.1.1", - "hardhat-deploy": "^0.7.0-beta.37", + "hardhat-deploy": "^0.7.2", "hardhat-typechain": "^0.3.3", "solidity-coverage": "^0.7.15", "tmp-promise": "^3.0.2", @@ -46,11 +46,14 @@ "unique-names-generator": "^4.3.1" }, "scripts": { - "clean": "rm -rf artifacts cache typechain", + "clean": "rm -rf artifacts cache typechain deployments", "compile": "hardhat compile --force", "compile:cached": "hardhat compile", "test": "hardhat test", "coverage": "hardhat coverage --temp artifacts", + "set-ens": "hardhat ens:set-addr", + "reclaim-ens": "hardhat ens:reclaim", + "ens-subdomain": "hardhat ens:subdomain", "deploy": "hardhat deploy", "deploy-govern": "hardhat deploy-govern", "verify": "hardhat etherscan-verify --license GPL-3.0 --solc-input --api-key process.env.ETHERSCAN_KEY" diff --git a/packages/govern-create/tasks/ens.ts b/packages/govern-create/tasks/ens.ts new file mode 100644 index 000000000..88cfcb91a --- /dev/null +++ b/packages/govern-create/tasks/ens.ts @@ -0,0 +1,304 @@ +import { task, types } from 'hardhat/config' +import { Ens } from '../utils/ens' +import { constants, utils } from 'ethers' + +/* + * This task is used to set the ENS address record + * To run it: + * yarn set-ens --name governbasefactory.aragon.eth --address 0xB75290E69F83b52BfbF9C99B4Ae211935E75A851 --network rinkeby + * + * See https://github.com/aragon/govern/tree/develop/packages/govern-create on how to setup .env file with account mnemonic + */ + +task('ens:set-addr', 'Set the ENS address record') + .addParam('name', 'The ENS name to set') + .addParam('address', 'The address to set to') + .setAction(async ({ name, address }, env) => { + const { network } = env + const ens = await Ens.createEns(network.provider) + let from = '' + + try { + const tx = await ens.setAddr(name, address) + if (!tx) { + console.log( + `INFO: The ens name has already been set to the given address` + ) + return + } + + from = tx.from + console.log('transaction') + console.log(' hash:', tx.hash) + console.log(' from:', tx.from) + console.log(' to:', tx.to) + console.log(' value:', tx.value.toString()) + console.log(' data:', tx.data) + + const receipt = await tx.wait() + console.log('Success?', Boolean(receipt.status)) + } catch (err) { + console.log('') + console.log('=== ERROR ===') + + const authorisedAddress = await ens.getOwner(name) + if ( + authorisedAddress !== from && + authorisedAddress != constants.AddressZero + ) { + console.log( + 'The account may not have the authorisation to set the address record' + ) + console.log(`Try using the account: ${authorisedAddress}`) + } + + console.log(err.message) + } + }) + +/* + * Reclaim the ownership of an ENS name. By default, it only prints the transaction data + * to be run by a multisig wallet contract. + * + * To print the transaction data for reclaiming aragon.eth (note that label == aragon, not aragon.eth) + * yarn reclaim-ens --network rinkeby --label aragon --controller 0xb5BdAa442BB34F27e793861C456CD5bDC527Ac8C + * + * To run the transaction directly, use the `--print false` flag + * yarn reclaim-ens --network rinkeby --print false --label aragon --controller 0xb5BdAa442BB34F27e793861C456CD5bDC527Ac8C + * + * Since the contract address (transaction.to value) is the same for both testnet and mainnet enviornment in ENS system, + * it's fine to run this command in rinkeby network to print the transaction data + */ +task('ens:reclaim', 'Reclaim the ownership of an ENS name') + .addParam('label', 'The ENS label, without .eth') + .addParam('controller', 'The controller of the ENS') + .addOptionalParam( + 'print', + 'Print the transaction data only', + true, + types.boolean + ) + .setAction(async ({ label, controller, print }, env) => { + const { network, ethers } = env + const ens = await Ens.createEns(network.provider, print) + + try { + const registrar = await ens.getEthRegistrar() + const id = utils.id(label) + const tx = print + ? await registrar.populateTransaction.reclaim(id, controller) + : await registrar.reclaim(id, controller) + + console.log('transaction') + console.log(' to:', tx.to) + console.log(' value:', tx.value?.toString() || '0') + console.log(' data:', tx.data) + + if (!print) { + console.log(' from: ', tx.from) + console.log(' transaction hash: ', tx.hash) + const receipt = await tx.wait() + console.log('Success?', Boolean(receipt.status)) + } + } catch (err) { + console.log(err.message) + } + }) + +/* + * Create ENS subdomain and set the resolver + * + * To create a subdomain, deploy.aragon.eth, you would pass parent = aragon.eth, label = deploy + * Similarily, to create a subdomain, govern.deploy.aragon.eth, use parent = deploy.aragon.eth, label = govern + * + * To run create the subdomain directly, not just printing the transaction data, use the `--print false` flag + * yarn ens-subdomain --network rinkeby --label deploy --parent aragon.eth --controller 0xb5BdAa442BB34F27e793861C456CD5bDC527Ac8C --print false + * + * To run the command without sending the transaction to the network, just print the transaction data, omit the --print flag + */ +task('ens:subdomain', 'Create a new ENS subdomain and set the resolver') + .addParam('parent', 'The parent domain name') + .addParam('label', 'The subdomain label') + .addParam('controller', 'The controller address of the subdomain') + .addOptionalParam('resolver', 'The resolver address, default to resolver.eth') + .addOptionalParam( + 'print', + 'Print the transaction data only', + true, + types.boolean + ) + .addOptionalParam('gas', 'The maximum gas to use, default will estimate') + .setAction( + async ({ parent, label, controller, resolver, gas, print }, env) => { + const { network, ethers } = env + const ens = await Ens.createEns(network.provider, print) + + try { + const [signer] = print ? await ethers.getSigners() : [] + + // use default resolver + const resolverOrDefault = + controller === constants.AddressZero + ? constants.AddressZero + : resolver || (await ethers.provider.resolveName('resolver.eth')) + const nodehash = utils.namehash(parent) + const labelhash = utils.id(label) + const ttl = 0 + const overrides = { gasLimit: gas } + + console.log('nodehash', nodehash) + console.log('labelhash', labelhash) + + const tx = print + ? await ens.ens.populateTransaction.setSubnodeRecord( + nodehash, + labelhash, + controller, + resolverOrDefault, + ttl + ) + : await ens.ens.setSubnodeRecord( + nodehash, + labelhash, + controller, + resolverOrDefault, + ttl, + overrides + ) + + console.log('transaction') + console.log(' to:', tx.to) + console.log(' value:', tx.value?.toString() || '0') + console.log(' data:', tx.data) + + if (!print) { + console.log(' from: ', tx.from) + console.log(' transaction hash: ', tx.hash) + const receipt = await tx.wait() + console.log('Success?', Boolean(receipt.status)) + } + } catch (err) { + console.log(err.message) + } + } + ) + +/* + * Set the ENS resolver and ttl (time-to-live caching) + * - name is the fully qualified ENS name, i.e. deploy.aragon.eth + * + * This task was created for debugging purposes, so, would not add to the package.json + * + * It can be run like this: + * npx hardhat ens:setrecord --network rinkeby --name deploy.wonderful.eth --controller 0xb5BdAa442BB34F27e793861C456CD5bDC527Ac8C --resolver 0xf6305c19e814d2a75429Fd637d01F7ee0E77d615 + */ +task('ens:setsubnode', 'Create a new ENS subdomain') + .addParam('parent', 'The parent domain name') + .addParam('label', 'The subdomain label') + .addParam('controller', 'The controller address of the subdomain') + .addOptionalParam( + 'print', + 'Print the transaction data only', + true, + types.boolean + ) + .setAction(async ({ parent, label, controller, print }, env) => { + const { network, ethers } = env + const ens = await Ens.createEns(network.provider, print) + + try { + const [signer] = print ? await ethers.getSigners() : [] + + // use default resolver + const resolver = await ethers.provider.resolveName('resolver.eth') + const nodehash = utils.namehash(parent) + const labelhash = utils.id(label) + const ttl = 0 + + const tx = print + ? await ens.ens.populateTransaction.setSubnodeOwner( + nodehash, + labelhash, + controller + ) + : await ens.ens.setSubnodeOwner(nodehash, labelhash, controller) + + console.log('transaction') + console.log(' to:', tx.to) + console.log(' value:', tx.value?.toString() || '0') + console.log(' data:', tx.data) + + if (!print) { + console.log(' from: ', tx.from) + console.log(' transaction hash: ', tx.hash) + const receipt = await tx.wait() + console.log('Success?', Boolean(receipt.status)) + } + } catch (err) { + console.log(err.message) + } + }) + +/* + * Set the ENS resolver and ttl + * - name is the fully qualified ENS name, i.e. deploy.aragon.eth + * - ttl is the caching time-to-live of the name, default to 0 + * see https://docs.ens.domains/contract-api-reference/ens#get-ttl + * - resolver is the address of the contract that does name resolution + * + * This task was created for debugging purposes, so, would not add to the package.json + * + * It can be run like this: + * npx hardhat ens:setrecord --network rinkeby --name deploy.wonderful.eth --controller 0xb5BdAa442BB34F27e793861C456CD5bDC527Ac8C --resolver 0xf6305c19e814d2a75429Fd637d01F7ee0E77d615 + */ +task('ens:setrecord', 'Create a new ENS subdomain') + .addParam('name', 'The domain name') + .addParam('controller', 'The controller address of the subdomain') + .addParam('resolver', 'The resolver address') + .addOptionalParam( + 'ttl', + 'The caching time-to-live of the ENS name', + 0, + types.int + ) + .addOptionalParam( + 'print', + 'Print the transaction data only', + true, + types.boolean + ) + .setAction(async ({ name, controller, resolver, print }, env) => { + const { network, ethers } = env + const ens = await Ens.createEns(network.provider, print) + + try { + const [signer] = print ? await ethers.getSigners() : [] + + const nodehash = utils.namehash(name) + const ttl = 0 + + const tx = print + ? await ens.ens.populateTransaction.setRecord( + nodehash, + controller, + resolver, + ttl + ) + : await ens.ens.setRecord(nodehash, controller, resolver, ttl) + + console.log('transaction') + console.log(' to:', tx.to) + console.log(' value:', tx.value?.toString() || '0') + console.log(' data:', tx.data) + console.log(' namehash', nodehash) + + if (!print) { + console.log(' from: ', tx.from) + console.log(' transaction hash: ', tx.hash) + const receipt = await tx.wait() + console.log('Success?', Boolean(receipt.status)) + } + } catch (err) { + console.log(err.message) + } + }) diff --git a/packages/govern-create/tasks/govern.ts b/packages/govern-create/tasks/govern.ts index 43acd58ba..46e43c276 100644 --- a/packages/govern-create/tasks/govern.ts +++ b/packages/govern-create/tasks/govern.ts @@ -7,6 +7,8 @@ import { animals, } from 'unique-names-generator' +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' + function buildName(name: string | null): string { const uniqueName = name ?? @@ -46,11 +48,11 @@ task('deploy-govern', 'Deploys a Govern instance') const { ethers, deployments, network } = HRE const registryContract = registry - ? await ethers.getContractAt('GovernRegistry', registry) - : await ethers.getContractAt( - 'GovernRegistry', - (await deployments.get('GovernRegistry')).address - ) + ? await ethers.getContractAt('GovernRegistry', registry) + : await ethers.getContractAt( + 'GovernRegistry', + (await deployments.get('GovernRegistry')).address + ) const baseFactoryContract = factory ? await ethers.getContractAt('GovernBaseFactory', factory) @@ -58,13 +60,18 @@ task('deploy-govern', 'Deploys a Govern instance') 'GovernBaseFactory', (await deployments.get('GovernBaseFactory')).address ) - - const tx = await baseFactoryContract.newGovernWithoutConfig( - name, - token, - tokenName || name, - tokenSymbol, + + // TODO: newGovern has been changed, this needs to reflect. + const tx = await baseFactoryContract.newGovern( + { + tokenAddress: token, + tokenName: tokenName || name, + tokenSymbol: tokenSymbol, + tokenDecimals: 18, + }, useProxies, + ERC3000DefaultConfig, + name, { gasLimit: useProxies ? 2e6 : 9e6, gasPrice: 2e9, diff --git a/packages/govern-create/test/ens-e2e.test.ts b/packages/govern-create/test/ens-e2e.test.ts new file mode 100644 index 000000000..9c733c350 --- /dev/null +++ b/packages/govern-create/test/ens-e2e.test.ts @@ -0,0 +1,330 @@ +import { ethers, network } from 'hardhat' +import { Ens } from '../utils/ens' +import { Signer, Wallet, Contract, providers, utils, constants } from 'ethers' +import { RINKEBY_URL } from '../utils/network' + +import chai, { expect } from 'chai' +import { solidity } from 'ethereum-waffle' +chai.use(solidity) + +const InterfaceID_Controller = '0x018fac06' + +const ethControllerAbi = [ + 'function rentPrice(string memory name, uint duration) view public returns(uint)', + 'function available(string memory label) public view returns(bool)', + 'function commit(bytes32 commitment) public @500000', + 'function makeCommitmentWithConfig(string memory name, address owner, bytes32 secret, address resolver, address addr) pure public returns(bytes32)', + 'function registerWithConfig(string memory name, address owner, uint duration, bytes32 secret, address resolver, address addr) payable @500000', +] + +const ethRegistrarAbi = [ + 'function ownerOf(uint256 tokenId) view returns (address)', + 'function reclaim(uint256 id, address owner) @500000', + 'function safeTransferFrom(address from, address to, uint256 tokenId) @500000', + 'function nameExpires(uint256 id) external view returns(uint)', +] + +// fastforward time to speed up testing +async function advanceTime(seconds: number) { + await network.provider.send('evm_increaseTime', [seconds]) + await network.provider.send('evm_mine') +} + +function getNetwork(): providers.Network { + const rinkebyNetwork = providers.getNetwork('rinkeby') + return { + name: network.name, + chainId: network.config.chainId || 1337, + ensAddress: rinkebyNetwork.ensAddress, + } +} + +// TODO: remove this when the aragon rinkeby node is up +async function getJsonRpcUrl(): Promise { + let url: string = RINKEBY_URL + const infuraProvider = new providers.InfuraProvider('rinkeby') + + try { + const provider = new providers.JsonRpcProvider(url) + await provider.getBlockNumber() + } catch (err) { + url = infuraProvider.connection.url + } + + return url +} + +class EnsHelper extends Ens { + private controller: Contract + private registrar: Contract + + constructor( + provider: any, + networkInfo: providers.Network, + controllerAddress: string, + registrarAddress: string + ) { + super(provider, networkInfo) + this.controller = new Contract( + controllerAddress, + ethControllerAbi, + this.signer + ) + this.registrar = new Contract( + registrarAddress, + ethRegistrarAbi, + this.signer + ) + } + + static async createEnsHelper( + provider: any, + networkInfo: providers.Network + ): Promise { + const ens = new Ens(provider, networkInfo) + const ethNodehash = utils.namehash('eth') + const resolver = await ens.getResolver(ethNodehash) + const controllerAddress = await resolver.interfaceImplementer( + ethNodehash, + InterfaceID_Controller + ) + const registrarAddress = await ens.getOwner('eth') + + const ensHelper = new EnsHelper( + provider, + networkInfo, + controllerAddress, + registrarAddress + ) + return ensHelper + } + + async commit(args: any) { + const { domain, owner, salt, resolver, address } = args + try { + const commitment = await this.controller.makeCommitmentWithConfig( + domain, + owner, + salt, + resolver, + address + ) + const commitTx = await this.controller.commit(commitment) + await commitTx.wait() + } catch (err) { + console.log('failed to make commitment', err) + throw err + } + } + + async register(args: any) { + const { domain, owner, duration, salt, resolver, address } = args + try { + const fee = await this.controller.rentPrice(domain, duration) + const overrides = { value: fee.mul(11).div(10) } + const tx = await this.controller.registerWithConfig( + domain, + owner, + duration, + salt, + resolver, + address, + overrides + ) + await tx.wait() + } catch (err) { + console.log('failed to register', err) + throw err + } + } + + async addSubdomain(args: any) { + const { domain, subdomain, owner, resolver, ttl } = args + try { + const nodehash = ethers.utils.namehash(`${domain}.eth`) + const labelhash = ethers.utils.id(subdomain) + const subnodeTx = await this.ens.setSubnodeRecord( + nodehash, + labelhash, + owner, + resolver, + ttl + ) + await subnodeTx.wait() + } catch (err) { + console.log('failed to add subdomain', err) + throw err + } + } + + async transfer(to: string, domain: string) { + const owner = await this.signer.getAddress() + const tokenId = utils.id(domain) + + try { + const tx = await this.ens.setOwner(utils.namehash(`${domain}.eth`), to) + await tx.wait() + } catch (err) { + console.log('failed to reclaim domain', err) + throw err + } + + try { + const tx = await this.registrar.safeTransferFrom(owner, to, tokenId) + await tx.wait() + } catch (err) { + console.log('failed to transfer domain', err) + throw err + } + } + + async registerDomain(domain: string, subdomain: string) { + const provider = this.signer.provider as providers.Provider + const owner = await this.signer.getAddress() + const signature = await this.signer.signMessage(`commit-${owner}-${domain}`) + const salt = utils.keccak256(signature) + const duration = 365 * 24 * 60 * 60 + const ttl = 0 + + // use standard resolver + const resolver = await provider.resolveName('resolver.eth') + + // the ENS name points to the signer's address by default + const address = await this.signer.getAddress() + + // make a commitment to register the domain + await this.commit({ domain, owner, salt, resolver, address }) + + // need to wait for 1 minute before registering + console.log('fast forward time 70s to register domain', domain) + await advanceTime(70) + + // register the domain + await this.register({ domain, owner, duration, salt, resolver, address }) + + // add subdomain + await this.addSubdomain({ domain, subdomain, owner, resolver, ttl }) + } +} + +// skipping this as it occasionally fail due to time out and +// due to hardhat not supporting EIP1559 in forking +// https://github.com/nomiclabs/hardhat/issues/1612 +describe.skip('ENS', function () { + this.timeout(50000) + + let testSigner: Signer + const subdomain = 'everything' + const domain = 'isawesome' + const name = `${subdomain}.${domain}.eth` + const anotherDomain = 'tobetransferred' + let ensNetwork: providers.Network + let ensHelper: EnsHelper + + before(async function () { + // fork from rinkeby + const jsonRpcUrl = await getJsonRpcUrl() + await network.provider.request({ + method: 'hardhat_reset', + params: [ + { + forking: { + jsonRpcUrl, + }, + }, + ], + }) + + ensNetwork = getNetwork() + const web3Provider = new providers.Web3Provider( + network.provider, + ensNetwork + ) + testSigner = web3Provider.getSigner() + + ensHelper = await EnsHelper.createEnsHelper(network.provider, ensNetwork) + await ensHelper.registerDomain(domain, subdomain) + await ensHelper.registerDomain(anotherDomain, subdomain) + }) + + after(async function () { + // reset back + await network.provider.request({ + method: 'hardhat_reset', + params: [], + }) + }) + + it('set address by the owner should work', async function () { + const ens = new Ens(network.provider, ensNetwork) + const wallet = ethers.Wallet.createRandom() + let tx = await ens.setAddr(name, wallet.address) + await tx.wait() + + const provider = testSigner.provider as providers.Provider + const address = await provider.resolveName(name) + expect(address).to.eq(wallet.address) + }) + + it('set address by non-owner should throw', async function () { + const wallet = Wallet.createRandom() + await ensHelper.transfer(wallet.address, anotherDomain) + + const ens = new Ens(network.provider, ensNetwork) + await expect(ens.setAddr(`${anotherDomain}.eth`, wallet.address)).to.be + .reverted + }) + + it('set address with invalid address should throw', async function () { + const ens = new Ens(network.provider, ensNetwork) + let error: Error | undefined + try { + await ens.setAddr(`${domain}.eth`, '0x1234') + } catch (err) { + error = err + } + expect(error).to.be.an('Error') + }) + + it('set with the same address will return null', async function () { + const ens = new Ens(network.provider, ensNetwork) + const wallet = Wallet.createRandom() + let tx = await ens.setAddr(name, wallet.address) + await tx.wait() + + tx = await ens.setAddr(name, wallet.address) + expect(tx).to.be.null + }) + + it('getOwner should return the owner of the ENS', async function () { + const ens = new Ens(network.provider, ensNetwork) + const owner = await ens.getOwner(name) + const address = await testSigner.getAddress() + expect(owner).to.eq(address) + }) + + it('getOwner should return zero for non-existent ENS name', async function () { + const ens = new Ens(network.provider, ensNetwork) + const owner = await ens.getOwner('nonexistentens') + expect(owner).to.eq(constants.AddressZero) + }) + + it('getResolver with valid ens name should work', async function () { + const ens = new Ens(network.provider, ensNetwork) + const nodehash = utils.namehash(name) + const resolver = await ens.getResolver(nodehash) + expect(resolver).to.have.property('address') + }) + + it('getResolver with non-existent ens name should throw', async function () { + const ens = new Ens(network.provider, ensNetwork) + let error: Error | undefined + try { + const nodehash = utils.namehash('nonexistentens') + await ens.getResolver(nodehash) + } catch (err) { + error = err + } + expect(error).to.be.an('Error') + }) +}) diff --git a/packages/govern-create/test/govern-base-factory-e2e.test.ts b/packages/govern-create/test/govern-base-factory-e2e.test.ts index 6e436ec8b..126add75a 100644 --- a/packages/govern-create/test/govern-base-factory-e2e.test.ts +++ b/packages/govern-create/test/govern-base-factory-e2e.test.ts @@ -1,70 +1,345 @@ import { deployments, ethers, network, waffle } from 'hardhat' -import { expect } from 'chai' import { GovernBaseFactory, GovernRegistry } from '../typechain' +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' +import { getConfigHash } from 'erc3k/utils/ERC3000'; +import { BigNumber } from 'ethers'; +import { container } from '@aragon/govern-core/test/pipelines/container'; + +// Overriding chai utils is important otherwise, checking event arguments +// with structs fail... +import chai, { expect } from 'chai' +import chaiUtils from '@aragon/govern-core/test/chai-utils' +chai.use(chaiUtils); const EVENTS = { REGISTERED: 'Registered', SET_METADATA: 'SetMetadata', + CONFIGURED: 'Configured', +} + +const ERRORS = { + SCHEDULE_EXCEEDED: 'basefactory: schedule list exceeded', + ACL_AUTH: 'acl: auth' } +const CUSTOM_ADDRESS = '0x' + '11'.repeat(20) +const ZERO_ADDRESS = '0x' + '00'.repeat(20) + +const ZERO_BYTES32 = '0x' + '00'.repeat(32) +const CUSTOM_BYTES32 = '0x' + '11'.repeat(32) + +const tokenConfig = { + tokenAddress: ZERO_ADDRESS, + tokenDecimals: 18, + tokenName: 'Eaglet Token', + tokenSymbol: 'EAG', + mintAddress: ZERO_ADDRESS, + mintAmount: 100, + merkleRoot: ZERO_BYTES32, + merkleMintAmount: 0, + merkleTree: '0x', + merkleContext: '0x' +}; + +const GAS_TARGET = network.name !== 'hardhat' ? 5.5e6 : 20e6 +const GAS_TARGET_PROXY = network.name !== 'hardhat' ? 6e5 : 2e6 + +const SCHEDULE_LIST_LIMIT = 10 + describe('Govern Base Factory with the real contracts(NO MOCKs)', function () { - beforeEach(async () => { + let signers: any, owner: any, signer1: any, signer2: any + let governBaseFactory: any + + let governQueueFactory: any, governTokenFactory: any, governRegistry: any, governFactory: any + + // Merge the abis so base factory's transaction can still get all the events decoded + async function getMergedABI() { + // @ts-ignore + const baseFactoryArtifact = await hre.artifacts.readArtifact('GovernBaseFactory') + // @ts-ignore + const tokenFactoryArtifact = await hre.artifacts.readArtifact('GovernTokenFactory'); + // @ts-ignore + const minterArtifact = await hre.artifacts.readArtifact('GovernMinter'); + // @ts-ignore + const registryArtifact = await hre.artifacts.readArtifact('GovernRegistry'); + // @ts-ignore + const governQueueArtifact = await hre.artifacts.readArtifact('GovernQueue'); + + return { + abi: [ + ...baseFactoryArtifact.abi, + ...tokenFactoryArtifact.abi.filter((f: any) => f.type === 'event'), + ...minterArtifact.abi.filter((f: any) => f.type === 'event'), + ...registryArtifact.abi.filter((f: any) => f.type === 'event'), + ...governQueueArtifact.abi.filter((f: any) => f.type === 'event') + ], + baseFactoryBytecode: baseFactoryArtifact.bytecode + } + } + + // This changes the ERC3000DefaultConfig + function updateConfig( + { scheduleToken, challengeToken, scheduleAmount, challengeAmount }: + { scheduleToken: string, challengeToken: string, scheduleAmount?: number, challengeAmount?: number } + ) { + return { + ...ERC3000DefaultConfig, + scheduleDeposit: { + token: scheduleToken, + amount: scheduleAmount || ERC3000DefaultConfig.scheduleDeposit.amount + }, + challengeDeposit: { + token: challengeToken, + amount: challengeAmount || ERC3000DefaultConfig.challengeDeposit.amount, + } + } + } + + async function updateContainer({ submitter, config }: { submitter: string, config: any }) { + return { + payload: { + ...container.payload, + executionTime: (await ethers.provider.getBlock('latest')).timestamp + config.executionDelay + 100, + submitter: submitter, + }, + config + } + } + + // This transforms config into specific array config + // so that we can directly put it inside mocha's withArgs + function updateConfigForArgs(config: any) { + return [ + config.executionDelay, + [ + config.scheduleDeposit.token, + BigNumber.from(config.scheduleDeposit.amount), + ], + [ + config.challengeDeposit.token, + BigNumber.from(config.challengeDeposit.amount), + ], + config.resolver, + config.rules, + config.maxCalldataSize + ] + } + + async function getDeployments(tx: any) { + const { events } = await tx.wait() + const { executor, queue, token } = events.find( + ({ event }: { event: any }) => event === EVENTS.REGISTERED + ).args + return { + queue: await ethers.getContractAt('GovernQueue', queue), + govern: await ethers.getContractAt('Govern', executor), + token: await ethers.getContractAt('GovernToken', token), + } + } + + before(async () => { await deployments.fixture() - }) - const deployDAO = async ( - useProxies: boolean, - gasTarget: number, - deployToken = false - ) => { - const registryDeployment = await deployments.get('GovernRegistry') - const registryContract = (await ethers.getContractAt( + signers = await ethers.getSigners() + owner = await signers[0].getAddress() + signer1 = await signers[1].getAddress() + signer2 = await signers[2].getAddress() + + governRegistry = (await ethers.getContractAt( 'GovernRegistry', - registryDeployment.address + (await deployments.get('GovernRegistry')).address )) as GovernRegistry - const baseFactoryDeployment = await deployments.get('GovernBaseFactory') - const baseFactoryContract = (await ethers.getContractAt( - 'GovernBaseFactory', - baseFactoryDeployment.address - )) as GovernBaseFactory - - const tx = baseFactoryContract.newGovernWithoutConfig( - 'eagle', - `0x${(deployToken ? '00' : '11').repeat(20)}`, // NOTE: zero addr deploys a token - 'Eaglet Token', - 'EAG', - useProxies - ) + governQueueFactory = (await ethers.getContractAt( + 'GovernRegistry', + (await deployments.get('GovernQueueFactory')).address + )) as GovernRegistry - await expect(tx).to.emit(registryContract, EVENTS.REGISTERED) - await expect(tx).to.emit(registryContract, EVENTS.SET_METADATA) + governTokenFactory = (await ethers.getContractAt( + 'GovernRegistry', + (await deployments.get('GovernTokenFactory')).address + )) as GovernRegistry - const { hash } = await tx - const { gasUsed } = await waffle.provider.getTransactionReceipt(hash) + governFactory = (await ethers.getContractAt( + 'GovernRegistry', + (await deployments.get('GovernFactory')).address + )) as GovernRegistry - expect(gasUsed).to.be.lte(gasTarget) - } + const { abi, baseFactoryBytecode } = await getMergedABI(); - const GAS_TARGET = network.name !== 'hardhat' ? 5.5e6 : 20e6 - const GAS_TARGET_PROXY = network.name !== 'hardhat' ? 6e5 : 2e6 + const GovernBaseFactory = new ethers.ContractFactory(abi, baseFactoryBytecode, signers[0]); + governBaseFactory = await GovernBaseFactory.deploy( + governRegistry.address, + governFactory.address, + governQueueFactory.address, + governTokenFactory.address + ); - it(`deploys DAO with custom token and doesn't use proxies under ${GAS_TARGET} gas`, async () => { - await deployDAO(false, GAS_TARGET, false) }) - it(`deploys DAO with new token and doesn't use proxies under ${GAS_TARGET} gas`, async () => { - await deployDAO(false, GAS_TARGET, true) - }) + describe('dao deployments with permission checking', async () => { + it(`reverts if schedule access list is more than allowed`, async () => { + const tx = governBaseFactory.newGovern( + tokenConfig, + Array(SCHEDULE_LIST_LIMIT + 1).fill(owner), + true, + ERC3000DefaultConfig, + 'eagle', + ) + await expect(tx).to.be.revertedWith(ERRORS.SCHEDULE_EXCEEDED) + }) + + it(`should deploy dao with new token, set schedule collateral to user's token, challenge collatral to new token`, async () => { + const scheduleAmount = 20; + const tx = await governBaseFactory.newGovern( + { + ...tokenConfig, + mintAddress: owner, + }, + [], + true, + { + ...ERC3000DefaultConfig, + scheduleDeposit: { + ...ERC3000DefaultConfig.challengeDeposit, + token: ZERO_ADDRESS, + amount: scheduleAmount // any amount more than 0 + }, + challengeDeposit: { + ...ERC3000DefaultConfig.challengeDeposit, + token: CUSTOM_ADDRESS + } + }, + 'eagle1' + ) + + const { token, queue } = await getDeployments(tx); + + const config = updateConfig({ + scheduleToken: token.address, + challengeToken: CUSTOM_ADDRESS, + scheduleAmount: scheduleAmount + }) + + await expect(tx).to.emit(queue, EVENTS.CONFIGURED) + .withArgs(getConfigHash(config), governBaseFactory.address, updateConfigForArgs(config)) + + await expect(queue.configure(ERC3000DefaultConfig)).to.be.revertedWith(ERRORS.ACL_AUTH) - it(`deploys DAO with new token and uses proxies under ${GAS_TARGET_PROXY} gas`, async () => { - await deployDAO(true, GAS_TARGET_PROXY, true) + // TODO: Giorgi + // connect from governbasefactory and call configure , it should again revert as above. + // connect from govern and call configure, it should succeed + // + }) + + it(`should deploy dao with custom token and change config with this token`, async () => { + const config = updateConfig({ scheduleToken: CUSTOM_ADDRESS, challengeToken: CUSTOM_ADDRESS }) + + const tx = await governBaseFactory.newGovern( + { + ...tokenConfig, + tokenAddress: CUSTOM_ADDRESS, + mintAddress: owner, + }, + [], + true, + config, + 'eagle2', + ) + + const { queue } = await getDeployments(tx); + + await expect(tx).to.emit(queue, EVENTS.CONFIGURED) + .withArgs(getConfigHash(config), governQueueFactory.address, updateConfigForArgs(config)) + }) + + it('deploys dao with schedule access list and checks permissions', async () => { + const tx = await governBaseFactory.newGovern( + { + ...tokenConfig, + mintAddress: owner, + }, + [signer1], + true, + ERC3000DefaultConfig, + 'eagle3', + ) + + const { token, queue } = await getDeployments(tx); + + const config = updateConfig({ scheduleToken: token.address, challengeToken: token.address }) + let container = await updateContainer({ submitter: owner, config: config }) + + // calling schedule from different address than address + // that was specified in schedule access list should revert + await expect(queue.schedule(container)).to.be.revertedWith(ERRORS.ACL_AUTH); + + // call schedule from the address that was passed as schedule list access + // if this doesn't fail, it means it was allowed + container = await updateContainer({ submitter: signer1, config: config }) + await expect(await (queue.connect(signers[1]).schedule(container))) + }) }) - it(`deploys DAO with custom token and uses proxies under ${GAS_TARGET_PROXY} gas`, async () => { - await deployDAO(true, GAS_TARGET_PROXY, false) + const options = [ + { + useProxies: false, + deployToken: false, + title: "Deploys Dao with custom token and doesn't use proxies", + GAS_TARGET: GAS_TARGET + }, + { + useProxies: true, + deployToken: false, + title: "Deploys Dao with custom token and uses proxies", + GAS_TARGET: GAS_TARGET_PROXY + }, + { + useProxies: true, + deployToken: true, + title: "Deploys Dao with new token and uses proxies", + GAS_TARGET: GAS_TARGET_PROXY + }, + { + useProxies: false, + deployToken: true, + title: "Deploys Dao with new token and doesn't use proxies", + GAS_TARGET: GAS_TARGET + }, + { + useProxies: false, + deployToken: true, + title: "Deploys Dao with new token, doesn't use proxies and uses merkle distributor", + merkleRoot: '0x' + '11'.repeat(32), + GAS_TARGET: GAS_TARGET + }, + ] + + describe("GAS Cost Check Tests", async () => { + options.forEach(async (item, index) => { + it(`${item.title}`, async () => { + const tx = await governBaseFactory.newGovern( + { + ...tokenConfig, + tokenAddress: item.deployToken ? ZERO_ADDRESS : CUSTOM_ADDRESS, + merkleRoot: item.merkleRoot ? CUSTOM_BYTES32 : ZERO_BYTES32 + }, + [signer1], + item.useProxies, + ERC3000DefaultConfig, + `DAO${index}`, + ) + await expect(tx).to.emit(governRegistry, EVENTS.REGISTERED) + await expect(tx).to.emit(governRegistry, EVENTS.SET_METADATA) + + const { hash } = await tx + const { gasUsed } = await waffle.provider.getTransactionReceipt(hash) + + expect(gasUsed).to.be.lte(item.GAS_TARGET) + }) + }) }) }) diff --git a/packages/govern-create/test/govern-base-factory-unit.test.ts b/packages/govern-create/test/govern-base-factory-unit.test.ts index 78cdd1894..a07d5ef56 100644 --- a/packages/govern-create/test/govern-base-factory-unit.test.ts +++ b/packages/govern-create/test/govern-base-factory-unit.test.ts @@ -3,117 +3,145 @@ import { expect } from 'chai' import { keccak256, solidityPack } from 'ethers/lib/utils' import { BigNumber } from 'ethers' -import { - GovernRegistryMock__factory, GovernRegistryMock, - GovernQueueFactoryMock__factory, GovernQueueFactoryMock, - GovernFactoryMock__factory, GovernFactoryMock, - GovernTokenFactoryMock__factory, GovernTokenFactoryMock, - GovernBaseFactory, GovernBaseFactory__factory +import { ERC3000DefaultConfig } from 'erc3k/utils/ERC3000' + +import { + GovernRegistryMock__factory, + GovernRegistryMock, + GovernQueueFactoryMock__factory, + GovernQueueFactoryMock, + GovernFactoryMock__factory, + GovernFactoryMock, + GovernTokenFactoryMock__factory, + GovernTokenFactoryMock, + GovernBaseFactory, + GovernBaseFactory__factory, } from '../typechain' -const zeroAddress = "0x0000000000000000000000000000000000000000" -const customAddress = "0x1111111111111111111111111111111111111111" - -const DUMMY_CONFIG = [ - BigNumber.from(0), - [ zeroAddress, BigNumber.from(0) ], - [ zeroAddress, BigNumber.from(0) ], - "0x0000000000000000000000000000000000000000", - "" -]; +const zeroAddress = ethers.constants.AddressZero +const customAddress = '0x'+'11'.repeat(20) describe('Govern Base Factory with mocked contracts', function () { - let GovernFactoryMock: GovernFactoryMock let GovernQueueFactoryMock: GovernQueueFactoryMock let GovernTokenFactoryMock: GovernTokenFactoryMock let GovernRegistryMock: GovernRegistryMock let GovernBaseFactory: GovernBaseFactory - let owner: any; + let owner: any before(async () => { - // Deploy Mocks GovernQueueFactoryMock = await ((await ethers.getContractFactory( - 'GovernQueueFactoryMock' - )) as GovernQueueFactoryMock__factory).deploy(); - + 'GovernQueueFactoryMock' + )) as GovernQueueFactoryMock__factory).deploy() + GovernTokenFactoryMock = await ((await ethers.getContractFactory( 'GovernTokenFactoryMock' - )) as GovernTokenFactoryMock__factory).deploy(); + )) as GovernTokenFactoryMock__factory).deploy() GovernFactoryMock = await ((await ethers.getContractFactory( 'GovernFactoryMock' - )) as GovernFactoryMock__factory).deploy(); + )) as GovernFactoryMock__factory).deploy() GovernRegistryMock = await ((await ethers.getContractFactory( 'GovernRegistryMock' - )) as GovernRegistryMock__factory).deploy(); - + )) as GovernRegistryMock__factory).deploy() // Deploy the GovernBaseFactory GovernBaseFactory = await ((await ethers.getContractFactory( 'GovernBaseFactory' - )) as GovernBaseFactory__factory).deploy(GovernRegistryMock.address, GovernFactoryMock.address, GovernQueueFactoryMock.address, GovernTokenFactoryMock.address); - + )) as GovernBaseFactory__factory).deploy( + GovernRegistryMock.address, + GovernFactoryMock.address, + GovernQueueFactoryMock.address, + GovernTokenFactoryMock.address + ) owner = await (await ethers.getSigners())[0].getAddress() - }) - - async function deployDAO(deployToken:boolean, useProxies: boolean, name: string) { - - const createSalt = (name: string, useProxies:boolean) => { - return useProxies ? keccak256(solidityPack(['string'], [name])) : "0x" + "0".repeat(64) + async function deployDAO( + deployToken: boolean, + useProxies: boolean, + name: string + ) { + const createSalt = (name: string, useProxies: boolean) => { + return useProxies + ? keccak256(solidityPack(['string'], [name])) + : '0x' + '0'.repeat(64) } - const tx = await GovernBaseFactory.newGovernWithoutConfig( + const mintAmount = 100 + + const token = { + tokenAddress: deployToken ? zeroAddress : customAddress, + tokenName: 'Eagle Token', + tokenSymbol: 'EAG', + tokenDecimals: 18, + mintAddress: owner, + mintAmount: mintAmount, + merkleRoot: '0x'+'00'.repeat(32), + merkleMintAmount:0, + merkleTree: '0x', + merkleContext: '0x' + }; + + const tx = await GovernBaseFactory.newGovern( + token, + [], + useProxies, + ERC3000DefaultConfig, name, - deployToken ? zeroAddress : customAddress, - 'Eagle Token', - 'EAG', - useProxies - ); - + ) + await expect(tx) .to.emit(GovernQueueFactoryMock, 'NewQueueCalledWith') .withArgs(GovernBaseFactory.address, createSalt(name, useProxies)) // TODO: add config check too after the fix about struct emitting is done. .to.emit(GovernFactoryMock, 'NewGovernCalledWith') - .withArgs(GovernQueueFactoryMock.address, createSalt(name, useProxies)); - - if(deployToken) { - await expect(tx). - to.emit(GovernTokenFactoryMock, 'NewTokenCalledWith') - .withArgs(GovernFactoryMock.address, 'Eagle Token', 'EAG', 18, owner, BigNumber.from(10).pow(BigNumber.from(18)), useProxies) + .withArgs(GovernQueueFactoryMock.address, createSalt(name, useProxies)) + + if (deployToken) { + await expect(tx) + .to.emit(GovernTokenFactoryMock, 'NewTokenCalledWith') + .withArgs( + GovernFactoryMock.address, + 'Eagle Token', + 'EAG', + 18, + owner, + mintAmount, + useProxies + ) } - await expect(tx) .to.emit(GovernRegistryMock, 'registerCalledWith') - .withArgs(GovernFactoryMock.address, GovernQueueFactoryMock.address, deployToken ? GovernTokenFactoryMock.address : customAddress, name, "0x") + .withArgs( + GovernFactoryMock.address, + GovernQueueFactoryMock.address, + deployToken ? GovernTokenFactoryMock.address : customAddress, + deployToken ? GovernTokenFactoryMock.address : zeroAddress, + name, + '0x' + ) - // TODO: GovernQueueFactory emits the struct with 6 members with the BulkCalled event. Add it after the fix has been found // here to add. - } - - it('Deploys DAO with new token and proxies', async () => { - await deployDAO(true, true, 'Eagle'); + it('Deploys DAO with new token and proxies', async () => { + await deployDAO(true, true, 'Eagle') }) - it('Deploys DAO with new token, but without proxies', async () => { - await deployDAO(true, false, 'Eagle'); + it('Deploys DAO with new token, but without proxies', async () => { + await deployDAO(true, false, 'Eagle') }) - it('Deploys DAO with custom token and proxies', async () => { - await deployDAO(false, true, 'Eagle'); + it('Deploys DAO with custom token and proxies', async () => { + await deployDAO(false, true, 'Eagle') }) - it('Deploys DAO with custom token, but without proxies', async () => { - await deployDAO(false, false, 'Eagle'); + it('Deploys DAO with custom token, but without proxies', async () => { + await deployDAO(false, false, 'Eagle') }) - }) diff --git a/packages/govern-create/utils/ens.ts b/packages/govern-create/utils/ens.ts new file mode 100644 index 000000000..3083cb57f --- /dev/null +++ b/packages/govern-create/utils/ens.ts @@ -0,0 +1,108 @@ +import { + Contract, + constants, + utils, + providers, + VoidSigner, + Signer, +} from 'ethers' + +const ensAbi = [ + 'function resolver(bytes32 node) external view returns (address)', + 'function owner(bytes32 node) external view returns (address)', + 'function setOwner(bytes32 node, address owner) external @500000', + 'function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external', + 'function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public', + 'function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external', +] + +const resolverAbi = [ + 'function interfaceImplementer(bytes32 nodehash, bytes4 interfaceId) view returns (address)', + 'function addr(bytes32 nodehash) view returns (address)', + 'function setAddr(bytes32 nodehash, address addr) @500000', +] + +const ethRegistrarAbi = ['function reclaim(uint256 id, address owner) external'] + +function isSameAddress(address1: string, address2: string): boolean { + try { + const normalizedAddress1 = utils.getAddress(address1) + const normalizedAddress2 = utils.getAddress(address2) + return normalizedAddress1 === normalizedAddress2 + } catch (error) { + return false + } +} + +function isValidAddress(address: string) { + return utils.isAddress(address) && address !== constants.AddressZero +} + +export class Ens { + protected readonly signer: Signer + readonly ens: Contract + private readonly web3Provider: providers.Web3Provider + + constructor( + provider: any, + network: providers.Network, + readonly: boolean = false + ) { + this.web3Provider = new providers.Web3Provider(provider, network) + if (readonly) { + this.signer = new VoidSigner(constants.AddressZero, this.web3Provider) + this.ens = new Contract(network.ensAddress!, ensAbi, this.web3Provider) + } else { + this.signer = this.web3Provider.getSigner() + this.ens = new Contract(network.ensAddress!, ensAbi, this.signer) + } + } + + static async createEns( + provider: any, + readonly: boolean = false + ): Promise { + const web3 = new providers.Web3Provider(provider) + const network = await web3.getNetwork() + if (!network.ensAddress) { + throw new Error('ENS is not defined in this environment') + } + + return new Ens(provider, network, readonly) + } + + async getResolver(nodehash: string): Promise { + const address = await this.ens.resolver(nodehash) + if (!isValidAddress(address)) { + throw new Error('ENS name not found') + } + + return new Contract(address, resolverAbi, this.signer) + } + + async getEthRegistrar(): Promise { + const address = await this.ens.owner(utils.namehash('eth')) + return new Contract(address, ethRegistrarAbi, this.signer) + } + + async setAddr( + name: string, + address: string + ): Promise { + if (!isValidAddress(address)) { + throw new Error('Invalid address') + } + + const nodehash = utils.namehash(name) + const resolver = await this.getResolver(nodehash) + const currentAddress = await resolver.addr(nodehash) + return isSameAddress(address, currentAddress) + ? null + : resolver.setAddr(nodehash, address) + } + + getOwner(name: string): Promise { + const nodehash = utils.namehash(name) + return this.ens.owner(nodehash) + } +} diff --git a/packages/govern-create/utils/etherscan.ts b/packages/govern-create/utils/etherscan.ts index 40cd1d347..45cc4a43a 100644 --- a/packages/govern-create/utils/etherscan.ts +++ b/packages/govern-create/utils/etherscan.ts @@ -2,7 +2,7 @@ import HRE from 'hardhat' import fs from 'fs' import { file } from 'tmp-promise' -export const SUPPORTED_ETHERSCAN_NETWORKS = ['mainnet', 'rinkeby'] +export const SUPPORTED_ETHERSCAN_NETWORKS = ['mainnet', 'rinkeby', 'rinkeby_staging'] function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)) @@ -13,7 +13,6 @@ export const verifyContract = async ( constructorArguments: any[] ) => { const currentNetwork = HRE.network.name - if (!process.env.ETHERSCAN_KEY) { throw Error('Missing process.env.ETHERSCAN_KEY.') } @@ -70,7 +69,7 @@ export const runTaskWithRetry = async ( } catch (error) { counter-- // This is not the ideal check, but it's all that's possible for now https://github.com/nomiclabs/hardhat/issues/1301 - if(!/already verified/i.test(error.message)){ + if (!/already verified/i.test(error.message)) { console.log(`Retrying attemps: ${counter}.`) console.error(error.message) await runTaskWithRetry(task, params, counter, msDelay, cleanup) diff --git a/packages/govern-create/utils/network.ts b/packages/govern-create/utils/network.ts index 79cf2b0f9..237073770 100644 --- a/packages/govern-create/utils/network.ts +++ b/packages/govern-create/utils/network.ts @@ -1,4 +1,7 @@ import 'dotenv/config' + +export const RINKEBY_URL = 'https://rinkeby.eth.aragon.network' + export function node_url(networkName: string): string { if (networkName) { const uri = process.env['ETH_NODE_URI_' + networkName.toUpperCase()] diff --git a/packages/govern-discord/server.js b/packages/govern-discord/server.js index 7e19208cd..a79e96e4a 100644 --- a/packages/govern-discord/server.js +++ b/packages/govern-discord/server.js @@ -17,11 +17,13 @@ client.on('message', async (message) => { const script = `new-dao --name ${name}` console.log('executing', script) - await message.reply(`got it! Will let you know when your new *${name}* DAO is ready`) + await message.reply( + `got it! Will let you know when your new *${name}* DAO is ready` + ) try { const { stdout, stderr } = await execa('yarn', script.split(' ')) - await message.reply('alright, I\'m done!') + await message.reply("alright, I'm done!") await message.reply(stdout.split('----\n')[1]) } catch (e) { await message.reply('something went wrong :(') diff --git a/packages/govern-server/docker-compose.yml b/packages/govern-server/docker-compose.yml index 5a19f7287..812f87a48 100644 --- a/packages/govern-server/docker-compose.yml +++ b/packages/govern-server/docker-compose.yml @@ -1,13 +1,13 @@ -version: "3" +version: '3' services: graph-node: image: graphprotocol/graph-node ports: - - "8000:8000" - - "8001:8001" - - "8020:8020" - - "8030:8030" - - "8040:8040" + - '8000:8000' + - '8001:8001' + - '8020:8020' + - '8030:8030' + - '8040:8040' depends_on: - ipfs - postgres @@ -18,29 +18,29 @@ services: postgres_user: graph-node postgres_pass: let-me-in postgres_db: graph-node - ipfs: "ipfs:5001" - ethereum: "rinkeby:http://ganache:8545" + ipfs: 'ipfs:5001' + ethereum: 'rinkeby:http://ganache:8545' RUST_LOG: info ipfs: image: ipfs/go-ipfs:v0.4.23 ports: - - "5001:5001" + - '5001:5001' volumes: - ./dev-data/ipfs:/data/ipfs postgres: image: postgres ports: - - "5432:5432" + - '5432:5432' environment: POSTGRES_USER: graph-node POSTGRES_PASSWORD: let-me-in POSTGRES_DB: graph-node - user: "${HOST_UID}:${HOST_GID}" + user: '${HOST_UID}:${HOST_GID}' volumes: - ./dev-data/postgres:/var/lib/postgresql/data - command: ["postgres", "-cshared_preload_libraries=pg_stat_statements"] + command: ['postgres', '-cshared_preload_libraries=pg_stat_statements'] ganache: image: trufflesuite/ganache-cli ports: - - "8545:8545" - command: ["ganache-cli", "--fork", "https://rinkeby.eth.aragon.network"] + - '8545:8545' + command: ['ganache-cli', '--fork', 'https://rinkeby.eth.aragon.network'] diff --git a/packages/govern-subgraph/manifest/data/mainnet.json b/packages/govern-subgraph/manifest/data/mainnet.json index eb64feccf..8eedd34e1 100644 --- a/packages/govern-subgraph/manifest/data/mainnet.json +++ b/packages/govern-subgraph/manifest/data/mainnet.json @@ -4,8 +4,8 @@ "GovernRegistry": [ { "name": "GovernRegistry", - "address": "0x9dDC0BAB6aCCa5F374E2C21708b3107e5E973601", - "startBlock": 11158181 + "address": "0xf2b7D096cd34F228A6413e276132C21D98b19882", + "startBlock": 13003760 } ] } diff --git a/packages/govern-subgraph/manifest/data/rinkeby-staging.json b/packages/govern-subgraph/manifest/data/rinkeby-staging.json index b23be459e..8e28632ec 100644 --- a/packages/govern-subgraph/manifest/data/rinkeby-staging.json +++ b/packages/govern-subgraph/manifest/data/rinkeby-staging.json @@ -4,8 +4,8 @@ "GovernRegistry": [ { "name": "GovernRegistry", - "address": "0x0cd3621EC403F26ad9F79c3d77B1dda1f8474c6f", - "startBlock": 7445834 + "address": "0xcc3F32957d316a12AFCFed04c0716af4814eCB2B", + "startBlock": 9056830 } ] } diff --git a/packages/govern-subgraph/manifest/data/rinkeby.json b/packages/govern-subgraph/manifest/data/rinkeby.json index 0dabf5c72..4a5ac5d9e 100644 --- a/packages/govern-subgraph/manifest/data/rinkeby.json +++ b/packages/govern-subgraph/manifest/data/rinkeby.json @@ -4,8 +4,8 @@ "GovernRegistry": [ { "name": "GovernRegistry", - "address": "0x87eE5EA31dCf1f526f21Bb576131C37890AE65E0", - "startBlock": 7445834 + "address": "0xf46253ef29FaedAbf63AA8cA6c0A41CbbdC93948", + "startBlock": 9056830 } ] } diff --git a/packages/govern-subgraph/manifest/templates/contracts/GovernRegistry.template.yaml b/packages/govern-subgraph/manifest/templates/contracts/GovernRegistry.template.yaml index 2e444777a..841e3c05d 100644 --- a/packages/govern-subgraph/manifest/templates/contracts/GovernRegistry.template.yaml +++ b/packages/govern-subgraph/manifest/templates/contracts/GovernRegistry.template.yaml @@ -4,7 +4,7 @@ network: {{network}} source: abi: GovernRegistry - address: "{{address}}" + address: '{{address}}' startBlock: {{startBlock}} mapping: kind: ethereum/events @@ -16,8 +16,10 @@ abis: - name: GovernRegistry file: $GOVERN_CORE_MODULE/abi/contracts/GovernRegistry.sol/GovernRegistry.json + - name: GovernQueue + file: $GOVERN_CORE_MODULE/abi/contracts/pipelines/GovernQueue.sol/GovernQueue.json eventHandlers: - - event: Registered(indexed address,address,indexed address,indexed address,string) + - event: Registered(indexed address,address,indexed address,address,indexed address,string) handler: handleRegistered - event: SetMetadata(indexed address,bytes) handler: handleSetMetadata diff --git a/packages/govern-subgraph/package.json b/packages/govern-subgraph/package.json index ee57a10a0..ccab4b043 100644 --- a/packages/govern-subgraph/package.json +++ b/packages/govern-subgraph/package.json @@ -26,7 +26,8 @@ "dependencies": { "@aragon/govern-core": "^1.0.0-beta.12", "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0" + "babel-register": "^6.26.0", + "file-type": "^16.5.0" }, "gitHead": "aabbf6bd2dac11872ba9bb1f1dc8fffb6044aa7c" } diff --git a/packages/govern-subgraph/schema.graphql b/packages/govern-subgraph/schema.graphql index aac8809ad..52240f4df 100644 --- a/packages/govern-subgraph/schema.graphql +++ b/packages/govern-subgraph/schema.graphql @@ -1,57 +1,82 @@ +# Types + type GovernRegistry @entity { id: ID! address: Bytes! count: Int! - entries: [RegistryEntry!]! + daos: [Dao!]! } -type RegistryEntry @entity { +type Dao @entity { id: ID! name: String! queue: GovernQueue! executor: Govern! + token: String! + minter: String + registrant: String! + createdAt: BigInt! +} + +type Deposit @entity { + id: ID! + sender: Bytes! + amount: BigInt! + token: Bytes! + reference: String! + govern: Govern! +} + +type Withdraw @entity { + id: ID! + from: Bytes! + to: Bytes! + amount: BigInt! + token: Bytes! + reference: String! + govern: Govern! } type Govern @entity { id: ID! + deposits: [Deposit!]! @derivedFrom(field: "govern") + withdraws: [Withdraw!]! @derivedFrom(field: "govern") address: Bytes! metadata: Bytes - registryEntries: [RegistryEntry!]! @derivedFrom(field: "executor") - containers: [Container]! roles: [Role!]! } type GovernQueue @entity { id: ID! address: Bytes! + nonce: BigInt! config: Config! - registryEntries: [RegistryEntry!]! @derivedFrom(field: "queue") - queued: [Container!]! @derivedFrom(field: "queue") + containers: [Container!]! @derivedFrom(field: "queue") roles: [Role!]! } -type Config @entity { +type Container @entity { id: ID! + state: ContainerState! queue: GovernQueue! + config: Config! + payload: Payload! + createdAt: BigInt! + history: [ContainerEvent!]! @derivedFrom(field: "container") +} + +type Config @entity { + id: ID! executionDelay: BigInt! scheduleDeposit: Collateral! challengeDeposit: Collateral! resolver: Bytes! rules: Bytes! + maxCalldataSize: BigInt! } -type Container @entity { +type Payload @entity { id: ID! - queue: GovernQueue! - state: ContainerState! - config: Config! - payload: ContainerPayload! - history: [ContainerEvent!]! @derivedFrom(field: "container") -} - -type ContainerPayload @entity { - id: ID! - container: Container! @derivedFrom(field: "payload") nonce: BigInt! executionTime: BigInt! submitter: Bytes! @@ -59,20 +84,24 @@ type ContainerPayload @entity { actions: [Action!]! @derivedFrom(field: "payload") allowFailuresMap: Bytes! proof: Bytes! + title: String } type Collateral @entity { id: ID! token: Bytes! amount: BigInt! + decimals: Int + name: String + symbol: String } type Action @entity { id: ID! - payload: ContainerPayload! to: Bytes! value: BigInt! data: Bytes! + payload: Payload! } type Role @entity { @@ -84,13 +113,15 @@ type Role @entity { frozen: Boolean! } +# Enums + enum ContainerState { None Scheduled Approved Challenged Rejected - Cancelled + Vetoed Executed } @@ -106,7 +137,7 @@ type ContainerEventChallenge implements ContainerEvent @entity { id: ID! container: Container! createdAt: BigInt! - actor: Bytes! + challenger: Bytes! collateral: Collateral! disputeId: BigInt! reason: Bytes! @@ -141,15 +172,6 @@ type ContainerEventSchedule implements ContainerEvent @entity { collateral: Collateral! } -type ContainerEventSubmitEvidence implements ContainerEvent @entity { - id: ID! - container: Container! - createdAt: BigInt! - evidence: Bytes! - submitter: Bytes! - finished: Boolean! -} - type ContainerEventVeto implements ContainerEvent @entity { id: ID! container: Container! diff --git a/packages/govern-subgraph/scripts/build-manifest.sh b/packages/govern-subgraph/scripts/build-manifest.sh index a1d3aad07..506876079 100755 --- a/packages/govern-subgraph/scripts/build-manifest.sh +++ b/packages/govern-subgraph/scripts/build-manifest.sh @@ -12,6 +12,7 @@ fi DATA=manifest/data/$FILE GOVERN_CORE_MODULE=$(node -e 'console.log(require("path").dirname(require.resolve("@aragon/govern-core/package.json")))') +GOVERN_CONTRACT_UTILS_MODULE=$(node -e 'console.log(require("path").dirname(require.resolve("@aragon/govern-contract-utils/package.json")))') echo 'Generating manifest from data file: '$DATA cat $DATA @@ -22,4 +23,5 @@ mustache \ $DATA \ subgraph.template.yaml \ | sed -e "s#\$GOVERN_CORE_MODULE#$GOVERN_CORE_MODULE#g" \ + | sed -e "s#\$GOVERN_CONTRACT_UTILS_MODULE#$GOVERN_CONTRACT_UTILS_MODULE#g" \ > subgraph.yaml diff --git a/packages/govern-subgraph/src/Govern.ts b/packages/govern-subgraph/src/Govern.ts index f18dc5e58..6047d8be9 100644 --- a/packages/govern-subgraph/src/Govern.ts +++ b/packages/govern-subgraph/src/Govern.ts @@ -1,14 +1,19 @@ -import { Address } from '@graphprotocol/graph-ts' +import { Address, BigDecimal, BigInt } from '@graphprotocol/graph-ts' import { Executed as ExecutedEvent, Frozen as FrozenEvent, Granted as GrantedEvent, - Revoked as RevokedEvent + Revoked as RevokedEvent, + Deposited as DepositedEvent, + Withdrawn as WithdrawnEvent, + ETHDeposited as ETHDepositedEvent } from '../generated/templates/Govern/Govern' -import { Govern as GovernEntity } from '../generated/schema' +import { Govern, Deposit, Withdraw } from '../generated/schema' import { frozenRoles, roleGranted, roleRevoked } from './lib/MiniACL' import { loadOrCreateContainer } from './GovernQueue' import { handleContainerEventExecute } from './utils/events' +import { buildId, buildIndexedId } from './utils/ids' +import { ZERO_ADDRESS } from './utils/constants' export function handleExecuted(event: ExecutedEvent): void { let govern = loadOrCreateGovern(event.address) @@ -16,15 +21,47 @@ export function handleExecuted(event: ExecutedEvent): void { handleContainerEventExecute(container, event) - let currentContainers = govern.containers - currentContainers.push(container.id) - govern.containers = currentContainers - govern.save() } -// MiniACL Events +// handleETHDeposited is very similar to handleDeposited. +// The difference is handleETHDeposited gets called with +// plain eth transfer + send/transfer. +export function handleETHDeposited(event: ETHDepositedEvent): void { + let deposit = new Deposit(buildId(event)); + let govern = loadOrCreateGovern(event.address) + deposit.reference = "" + deposit.sender = event.params.sender; + deposit.amount = event.params.amount; + deposit.token = ZERO_ADDRESS + deposit.govern = govern.id; + deposit.save(); +} + +export function handleDeposited(event: DepositedEvent): void { + let deposit = new Deposit(buildId(event)); + let govern = loadOrCreateGovern(event.address) + deposit.reference = event.params._reference + deposit.sender = event.params.sender; + deposit.amount = event.params.amount; + deposit.token = event.params.token; + deposit.govern = govern.id; + deposit.save(); +} + +export function handleWithdrawn(event: WithdrawnEvent): void { + let withdraw = new Withdraw(buildId(event)); + let govern = loadOrCreateGovern(event.address) + withdraw.reference = event.params._reference + withdraw.from = event.params.from; + withdraw.to = event.params.to; + withdraw.amount = event.params.amount; + withdraw.token = event.params.token; + withdraw.govern = govern.id; + withdraw.save(); +} +// MiniACL Events export function handleFrozen(event: FrozenEvent): void { let govern = loadOrCreateGovern(event.address) @@ -36,8 +73,6 @@ export function handleFrozen(event: FrozenEvent): void { export function handleGranted(event: GrantedEvent): void { let govern = loadOrCreateGovern(event.address) - // contemplar el caso en que se crea un nueva cola - let role = roleGranted(event.address, event.params.role, event.params.who) // add the role @@ -63,15 +98,14 @@ export function handleRevoked(event: RevokedEvent): void { // Helpers -export function loadOrCreateGovern(entity: Address): GovernEntity { +export function loadOrCreateGovern(entity: Address): Govern { let governId = entity.toHex() // Create govern - let govern = GovernEntity.load(governId) + let govern = Govern.load(governId) if (govern === null) { - govern = new GovernEntity(governId) + govern = new Govern(governId) govern.address = entity govern.roles = [] - govern.containers = [] } return govern! } diff --git a/packages/govern-subgraph/src/GovernQueue.ts b/packages/govern-subgraph/src/GovernQueue.ts index 3cae68fdc..a9e8bc5c7 100644 --- a/packages/govern-subgraph/src/GovernQueue.ts +++ b/packages/govern-subgraph/src/GovernQueue.ts @@ -1,4 +1,4 @@ -import { Address, Bytes, BigInt } from '@graphprotocol/graph-ts' +import { Address, Bytes, BigInt, ipfs, json, log } from '@graphprotocol/graph-ts' import { Challenged as ChallengedEvent, Configured as ConfiguredEvent, @@ -8,38 +8,40 @@ import { Resolved as ResolvedEvent, Revoked as RevokedEvent, Scheduled as ScheduledEvent, - Vetoed as VetoedEvent, - Ruled as RuledEvent, - GovernQueue as GovernQueueContract + Vetoed as VetoedEvent } from '../generated/templates/GovernQueue/GovernQueue' + +import { GovernQueue as GovernQueueContract } from '../generated/templates/GovernQueue/GovernQueue' +import { ERC20 } from '../generated/templates/GovernQueue/ERC20' +import { getERC20Info } from './utils/tokens'; + import { - Action as ActionEntity, - Collateral as CollateralEntity, - Config as ConfigEntity, - Container as ContainerEntity, - ContainerPayload as PayloadEntity, - GovernQueue as GovernQueueEntity + Action, + Collateral, + Config, + Container, + Payload, + GovernQueue } from '../generated/schema' import { frozenRoles, roleGranted, roleRevoked } from './lib/MiniACL' import { buildId, buildIndexedId } from './utils/ids' import { ZERO_ADDRESS, APPROVED_STATUS, - CANCELLED_STATUS, + VETOED_STATUS, CHALLENGED_STATUS, EXECUTED_STATUS, NONE_STATUS, REJECTED_STATUS, - SCHEDULED_STATUS, - ALLOW_RULING + SCHEDULED_STATUS } from './utils/constants' import { handleContainerEventChallenge, handleContainerEventResolve, - handleContainerEventRule, handleContainerEventSchedule, handleContainerEventVeto } from './utils/events' + import { loadOrCreateGovern } from './Govern' export function handleScheduled(event: ScheduledEvent): void { @@ -47,9 +49,11 @@ export function handleScheduled(event: ScheduledEvent): void { let payload = loadOrCreatePayload(event.params.containerHash) let container = loadOrCreateContainer(event.params.containerHash) let executor = loadOrCreateGovern(event.params.payload.executor) + // Builds each of the actions bundled in the payload, // and saves them to the DB. buildActions(event) + payload.nonce = event.params.payload.nonce payload.executionTime = event.params.payload.executionTime payload.submitter = event.params.payload.submitter @@ -57,8 +61,30 @@ export function handleScheduled(event: ScheduledEvent): void { payload.allowFailuresMap = event.params.payload.allowFailuresMap payload.proof = event.params.payload.proof + let proofIpfsHex = event.params.payload.proof.toHexString().substring(2) + + // if cidString is ipfs v1 version hex from the cid's raw bytes and + // we add `f` as a multibase prefix and remove `0x` + let result = ipfs.cat('f' + proofIpfsHex + "/metadata.json") + if (result) { + let data = json.fromBytes(result as Bytes) + payload.title = data.toObject().get('title').toString() + } else { + // if cidString is ipfs v0 version hex from the cid's raw bytes, + // we add: + // 1. 112 (0x70 in hex) which is dag-pb format. + // 2. 01 because we want to use v1 version + // 3. f since cidString is already hex, we only add `f` without converting anything. + result = ipfs.cat('f0170' + proofIpfsHex + '/metadata.json') + if(result) { + let data = json.fromBytes(result as Bytes) + payload.title = data.toObject().get('title').toString() + } + } + container.payload = payload.id container.state = SCHEDULED_STATUS + container.createdAt = event.block.timestamp // This should always be possible, as a queue without a config // should be impossible to get at this stage container.config = queue.config @@ -66,7 +92,7 @@ export function handleScheduled(event: ScheduledEvent): void { let config = loadConfig(queue.config) let scheduleDeposit = loadCollateral(config.scheduleDeposit) - handleContainerEventSchedule(container, event, scheduleDeposit as CollateralEntity) + handleContainerEventSchedule(container, event, scheduleDeposit as Collateral) executor.save() payload.save() @@ -86,7 +112,7 @@ export function handleChallenged(event: ChallengedEvent): void { container.state = CHALLENGED_STATUS - let resolver = ConfigEntity.load(queue.config).resolver + let resolver = Config.load(queue.config).resolver let containerEvent = handleContainerEventChallenge(container, event, resolver) containerEvent.save() @@ -108,7 +134,7 @@ export function handleVetoed(event: VetoedEvent): void { let queue = loadOrCreateQueue(event.address) let container = loadOrCreateContainer(event.params.containerHash) - container.state = CANCELLED_STATUS + container.state = VETOED_STATUS handleContainerEventVeto(container, event) @@ -120,26 +146,38 @@ export function handleConfigured(event: ConfiguredEvent): void { let queue = loadOrCreateQueue(event.address) let configId = buildId(event) - let config = new ConfigEntity(configId) + let config = new Config(configId) - let scheduleDeposit = new CollateralEntity( + let scheduleDeposit = new Collateral( buildIndexedId(event.transaction.hash.toHex(), 1) ) scheduleDeposit.token = event.params.config.scheduleDeposit.token scheduleDeposit.amount = event.params.config.scheduleDeposit.amount - let challengeDeposit = new CollateralEntity( + let challengeDeposit = new Collateral( buildIndexedId(event.transaction.hash.toHex(), 2) ) challengeDeposit.token = event.params.config.challengeDeposit.token challengeDeposit.amount = event.params.config.challengeDeposit.amount - config.queue = queue.id + // Grab Schedule Token info + let data = getERC20Info(event.params.config.scheduleDeposit.token) + scheduleDeposit.decimals = data.decimals; + scheduleDeposit.name = data.name; + scheduleDeposit.symbol = data.symbol; + + // Grab challenge Token info + data = getERC20Info(event.params.config.challengeDeposit.token) + challengeDeposit.decimals = data.decimals; + challengeDeposit.name = data.name; + challengeDeposit.symbol = data.symbol; + config.executionDelay = event.params.config.executionDelay config.scheduleDeposit = scheduleDeposit.id config.challengeDeposit = challengeDeposit.id config.resolver = event.params.config.resolver config.rules = event.params.config.rules + config.maxCalldataSize = event.params.config.maxCalldataSize queue.config = config.id @@ -185,36 +223,27 @@ export function handleRevoked(event: RevokedEvent): void { queue.save() } -// Helpers // create a dummy config when creating queue to avoid not-null error export function createDummyConfig(queueId: string): string { let ZERO = BigInt.fromI32(0) - // use queueId as the configId for this dummy config - // subsequent config configure call will use transaction - // id and log id as the id let configId = queueId - let config = new ConfigEntity(configId) + let config = new Config(configId) - let scheduleDeposit = new CollateralEntity( - buildIndexedId(configId, 1) - ) + let scheduleDeposit = new Collateral(buildIndexedId(configId, 1)) scheduleDeposit.token = ZERO_ADDRESS scheduleDeposit.amount = ZERO - let challengeDeposit = new CollateralEntity( - buildIndexedId(configId, 2) - ) + let challengeDeposit = new Collateral(buildIndexedId(configId, 2)) challengeDeposit.token = ZERO_ADDRESS challengeDeposit.amount = ZERO - config.queue = queueId config.executionDelay = ZERO config.scheduleDeposit = scheduleDeposit.id config.challengeDeposit = challengeDeposit.id config.resolver = ZERO_ADDRESS config.rules = Bytes.fromI32(0) as Bytes - + config.maxCalldataSize = BigInt.fromI32(0) scheduleDeposit.save() challengeDeposit.save() config.save() @@ -222,50 +251,53 @@ export function createDummyConfig(queueId: string): string { return config.id! } -export function loadOrCreateQueue(entity: Address): GovernQueueEntity { - let queueId = entity.toHex() +export function loadOrCreateQueue(queueAddress: Address): GovernQueue { + let queueId = queueAddress.toHex() // Create queue - let queue = GovernQueueEntity.load(queueId) + let queue = GovernQueue.load(queueId) if (queue === null) { - queue = new GovernQueueEntity(queueId) - queue.address = entity + queue = new GovernQueue(queueId) + queue.address = queueAddress queue.config = createDummyConfig(queueId) queue.roles = [] } + + queue.nonce = GovernQueueContract.bind(queueAddress).nonce() + return queue! } -export function loadOrCreateContainer(containerHash: Bytes): ContainerEntity { +export function loadOrCreateContainer(containerHash: Bytes): Container { let ContainerId = containerHash.toHex() // Create container - let container = ContainerEntity.load(ContainerId) + let container = Container.load(ContainerId) if (container === null) { - container = new ContainerEntity(ContainerId) + container = new Container(ContainerId) container.state = NONE_STATUS } return container! } -function loadOrCreatePayload(containerHash: Bytes): PayloadEntity { +function loadOrCreatePayload(containerHash: Bytes): Payload { let PayloadId = containerHash.toHex() // Create payload - let payload = PayloadEntity.load(PayloadId) + let payload = Payload.load(PayloadId) if (payload === null) { - payload = new PayloadEntity(PayloadId) + payload = new Payload(PayloadId) } return payload! } -function loadConfig(configAddress: string): ConfigEntity { - let config = ConfigEntity.load(configAddress) +function loadConfig(configAddress: string): Config { + let config = Config.load(configAddress) if (config === null) { throw new Error('Config not found.') } return config! } -function loadCollateral(collateralAddress: string): CollateralEntity { - let collateral = CollateralEntity.load(collateralAddress) +function loadCollateral(collateralAddress: string): Collateral { + let collateral = Collateral.load(collateralAddress) if (collateral === null) { throw new Error('Collateral not found.') } @@ -276,7 +308,7 @@ function buildActions(event: ScheduledEvent): void { let actions = event.params.payload.actions for (let index = 0; index < actions.length; index++) { let actionId = buildIndexedId(event.params.containerHash.toHex(), index) - let action = new ActionEntity(actionId) + let action = new Action(actionId) action.to = actions[index].to action.value = actions[index].value @@ -286,4 +318,3 @@ function buildActions(event: ScheduledEvent): void { action.save() } } - diff --git a/packages/govern-subgraph/src/GovernRegistry.ts b/packages/govern-subgraph/src/GovernRegistry.ts index be5589011..16617967c 100644 --- a/packages/govern-subgraph/src/GovernRegistry.ts +++ b/packages/govern-subgraph/src/GovernRegistry.ts @@ -1,43 +1,42 @@ import { Address } from '@graphprotocol/graph-ts' import { Registered as RegisteredEvent, - SetMetadata as SetMetadataEvent + SetMetadata as SetMetadataEvent, } from '../generated/GovernRegistry/GovernRegistry' import { Govern as GovernTemplate, - GovernQueue as GovernQueueTemplate + GovernQueue as GovernQueueTemplate, } from '../generated/templates' -import { - GovernRegistry as GovernRegistryEntity, - RegistryEntry as RegistryEntryEntity -} from '../generated/schema' +import { GovernRegistry, Dao } from '../generated/schema' import { loadOrCreateGovern } from './Govern' import { loadOrCreateQueue } from './GovernQueue' export function handleRegistered(event: RegisteredEvent): void { let registry = loadOrCreateRegistry(event.address) - // create and save these to avoid null error from - // registryEntries queries due to missing data let queue = loadOrCreateQueue(event.params.queue) let govern = loadOrCreateGovern(event.params.executor) + queue.save() govern.save() + let dao = new Dao(event.params.name) - let registryEntry = new RegistryEntryEntity(event.params.name) - - registryEntry.name = event.params.name - registryEntry.executor = event.params.executor.toHex() - registryEntry.queue = event.params.queue.toHex() + dao.name = event.params.name + dao.executor = event.params.executor.toHex() + dao.queue = event.params.queue.toHex() + dao.token = event.params.token.toHex() + dao.minter = event.params.minter.toHex() + dao.registrant = event.params.registrant.toHex() + dao.createdAt = event.block.timestamp - // add game to the registry - let currentEntries = registry.entries - currentEntries.push(registryEntry.id) - registry.entries = currentEntries + // add dao to the registry + let currentDAOs = registry.daos + currentDAOs.push(dao.id) + registry.daos = currentDAOs registry.count += 1 - registryEntry.save() + dao.save() registry.save() // Create datasource templates @@ -52,17 +51,15 @@ export function handleSetMetadata(event: SetMetadataEvent): void { govern.save() } -export function loadOrCreateRegistry( - registryAddress: Address -): GovernRegistryEntity { +export function loadOrCreateRegistry(registryAddress: Address): GovernRegistry { let registryId = registryAddress.toHex() - let registry = GovernRegistryEntity.load(registryId) + let registry = GovernRegistry.load(registryId) if (registry === null) { - registry = new GovernRegistryEntity(registryId) + registry = new GovernRegistry(registryId) registry.address = registryAddress registry.count = 0 - registry.entries = [] + registry.daos = [] } return registry! } diff --git a/packages/govern-subgraph/src/lib/MiniACL.ts b/packages/govern-subgraph/src/lib/MiniACL.ts index f4e6c9f7f..20580fce7 100644 --- a/packages/govern-subgraph/src/lib/MiniACL.ts +++ b/packages/govern-subgraph/src/lib/MiniACL.ts @@ -3,9 +3,9 @@ import { Role as RoleEntity } from '../../generated/schema' export function frozenRoles(roles: string[], selector: Bytes): void { roles - .map(role => RoleEntity.load(role)!) - .filter(role => role.selector === selector) - .forEach(role => { + .map((role) => RoleEntity.load(role)!) + .filter((role) => role.selector === selector) + .forEach((role) => { role.frozen = true role.save() }) diff --git a/packages/govern-subgraph/src/utils/constants.ts b/packages/govern-subgraph/src/utils/constants.ts index d2af45e31..d68fbc523 100644 --- a/packages/govern-subgraph/src/utils/constants.ts +++ b/packages/govern-subgraph/src/utils/constants.ts @@ -2,6 +2,7 @@ import { BigInt, Bytes } from '@graphprotocol/graph-ts' export const APPROVED_STATUS = 'Approved' export const CANCELLED_STATUS = 'Cancelled' +export const VETOED_STATUS = 'Vetoed' export const CHALLENGED_STATUS = 'Challenged' export const EXECUTED_STATUS = 'Executed' export const NONE_STATUS = 'None' @@ -10,4 +11,6 @@ export const SCHEDULED_STATUS = 'Scheduled' export let ALLOW_RULING = BigInt.fromI32(4) -export let ZERO_ADDRESS = Bytes.fromHexString("0x0000000000000000000000000000000000000000") as Bytes +export let ZERO_ADDRESS = Bytes.fromHexString( + '0x0000000000000000000000000000000000000000' +) as Bytes diff --git a/packages/govern-subgraph/src/utils/events.ts b/packages/govern-subgraph/src/utils/events.ts index be0544420..c043109e0 100644 --- a/packages/govern-subgraph/src/utils/events.ts +++ b/packages/govern-subgraph/src/utils/events.ts @@ -1,13 +1,12 @@ import { Collateral as CollateralEntity, Container as ContainerEntity, - ContainerEventChallenge as ContainerEventChallengeEntity, - ContainerEventExecute as ContainerEventExecuteEntity, - ContainerEventResolve as ContainerEventResolveEntity, - ContainerEventRule as ContainerEventRuleEntity, - ContainerEventSchedule as ContainerEventScheduleEntity, - ContainerEventSubmitEvidence as ContainerEventSubmitEvidenceEntity, - ContainerEventVeto as ContainerEventVetoEntity + ContainerEventChallenge, + ContainerEventExecute, + ContainerEventResolve, + ContainerEventRule, + ContainerEventSchedule, + ContainerEventVeto, } from '../../generated/schema' import { Executed as ExecutedEvent } from '../../generated/templates/Govern/Govern' import { @@ -15,10 +14,10 @@ import { Resolved as ResolvedEvent, Ruled as RuledEvent, Scheduled as ScheduledEvent, - Vetoed as VetoedEvent + Vetoed as VetoedEvent, } from '../../generated/templates/GovernQueue/GovernQueue' -import { buildId, buildIndexedId, buildEventHandlerId } from './ids' -import { Bytes } from "@graphprotocol/graph-ts" +import { buildId, buildEventHandlerId } from './ids' +import { Bytes } from '@graphprotocol/graph-ts' function finalizeContainerEvent( container: ContainerEntity, @@ -38,16 +37,20 @@ export function handleContainerEventChallenge( container: ContainerEntity, ethereumEvent: ChallengedEvent, resolver: Bytes -): ContainerEventChallengeEntity { - let eventId = buildEventHandlerId(container.id, 'challenge', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventChallenge { + let eventId = buildEventHandlerId( + container.id, + 'challenge', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventChallengeEntity(eventId) + let containerEvent = new ContainerEventChallenge(eventId) - containerEvent.actor = ethereumEvent.params.actor + containerEvent.challenger = ethereumEvent.params.actor containerEvent.reason = ethereumEvent.params.reason containerEvent.disputeId = ethereumEvent.params.resolverId containerEvent.resolver = resolver - + let collateral = new CollateralEntity(buildId(ethereumEvent)) collateral.token = ethereumEvent.params.collateral.token collateral.amount = ethereumEvent.params.collateral.amount @@ -55,7 +58,7 @@ export function handleContainerEventChallenge( containerEvent.collateral = collateral.id - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent @@ -65,13 +68,17 @@ export function handleContainerEventChallenge( export function handleContainerEventExecute( container: ContainerEntity, ethereumEvent: ExecutedEvent -): ContainerEventExecuteEntity { - let eventId = buildEventHandlerId(container.id, 'execute', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventExecute { + let eventId = buildEventHandlerId( + container.id, + 'execute', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventExecuteEntity(eventId) + let containerEvent = new ContainerEventExecute(eventId) containerEvent.execResults = ethereumEvent.params.execResults - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent @@ -81,13 +88,17 @@ export function handleContainerEventExecute( export function handleContainerEventResolve( container: ContainerEntity, ethereumEvent: ResolvedEvent -): ContainerEventResolveEntity { - let eventId = buildEventHandlerId(container.id, 'resolve', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventResolve { + let eventId = buildEventHandlerId( + container.id, + 'resolve', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventResolveEntity(eventId) + let containerEvent = new ContainerEventResolve(eventId) containerEvent.approved = ethereumEvent.params.approved - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent @@ -97,13 +108,17 @@ export function handleContainerEventResolve( export function handleContainerEventRule( container: ContainerEntity, ethereumEvent: RuledEvent -): ContainerEventRuleEntity { - let eventId = buildEventHandlerId(container.id, 'rule', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventRule { + let eventId = buildEventHandlerId( + container.id, + 'rule', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventRuleEntity(eventId) + let containerEvent = new ContainerEventRule(eventId) containerEvent.ruling = ethereumEvent.params.ruling - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent @@ -114,10 +129,14 @@ export function handleContainerEventSchedule( container: ContainerEntity, ethereumEvent: ScheduledEvent, scheduleDeposit: CollateralEntity -): ContainerEventScheduleEntity { - let eventId = buildEventHandlerId(container.id, 'schedule', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventSchedule { + let eventId = buildEventHandlerId( + container.id, + 'schedule', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventScheduleEntity(eventId) + let containerEvent = new ContainerEventSchedule(eventId) let collateral = new CollateralEntity(buildId(ethereumEvent)) collateral.token = scheduleDeposit.token @@ -126,25 +145,27 @@ export function handleContainerEventSchedule( containerEvent.collateral = collateral.id - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent ) } - - export function handleContainerEventVeto( container: ContainerEntity, ethereumEvent: VetoedEvent -): ContainerEventVetoEntity { - let eventId = buildEventHandlerId(container.id, 'veto', ethereumEvent.transactionLogIndex.toHexString()) +): ContainerEventVeto { + let eventId = buildEventHandlerId( + container.id, + 'veto', + ethereumEvent.transactionLogIndex.toHexString() + ) - let containerEvent = new ContainerEventVetoEntity(eventId) + let containerEvent = new ContainerEventVeto(eventId) containerEvent.reason = ethereumEvent.params.reason - return finalizeContainerEvent( + return finalizeContainerEvent( container, containerEvent, ethereumEvent diff --git a/packages/govern-subgraph/src/utils/tokens.ts b/packages/govern-subgraph/src/utils/tokens.ts new file mode 100644 index 000000000..4f0198fa3 --- /dev/null +++ b/packages/govern-subgraph/src/utils/tokens.ts @@ -0,0 +1,25 @@ +import { ethereum } from '@graphprotocol/graph-ts' +import { ERC20 } from '../../generated/templates/GovernQueue/ERC20' +import { Address } from '@graphprotocol/graph-ts' + +class ERCInfo { + decimals: i32; + name: string; + symbol: string; +} + +export function getERC20Info( + address: Address +): ERCInfo { + let token = ERC20.bind(address); + + let decimals = token.try_decimals(); + let name = token.try_name(); + let symbol = token.try_symbol(); + + return { + decimals: decimals.reverted ? null : decimals.value, + name: name.reverted ? null : name.value, + symbol: decimals.reverted ? null : symbol.value + } +} diff --git a/packages/govern-subgraph/src/utils/transforms.ts b/packages/govern-subgraph/src/utils/transforms.ts new file mode 100644 index 000000000..18f8dfbe1 --- /dev/null +++ b/packages/govern-subgraph/src/utils/transforms.ts @@ -0,0 +1,5 @@ +import { BigInt } from '@graphprotocol/graph-ts' + +export function toMs(time: BigInt) : BigInt { + return time.times(BigInt.fromI32(1000)) +} \ No newline at end of file diff --git a/packages/govern-subgraph/subgraph.template.yaml b/packages/govern-subgraph/subgraph.template.yaml index 595963f27..dcc1fc175 100644 --- a/packages/govern-subgraph/subgraph.template.yaml +++ b/packages/govern-subgraph/subgraph.template.yaml @@ -27,8 +27,10 @@ templates: abis: - name: GovernQueue file: $GOVERN_CORE_MODULE/abi/contracts/pipelines/GovernQueue.sol/GovernQueue.json + - name: ERC20 + file: $GOVERN_CONTRACT_UTILS_MODULE/abi/contracts/erc20/ERC20.sol/ERC20.json eventHandlers: - - event: Configured(indexed bytes32,indexed address,(uint256,(address,uint256),(address,uint256),address,bytes)) + - event: Configured(indexed bytes32,indexed address,(uint256,(address,uint256),(address,uint256),address,bytes,uint256)) handler: handleConfigured - event: Frozen(indexed bytes4,indexed address) handler: handleFrozen @@ -63,13 +65,21 @@ templates: abis: - name: Govern file: $GOVERN_CORE_MODULE/abi/contracts/Govern.sol/Govern.json + - name: GovernQueue + file: $GOVERN_CORE_MODULE/abi/contracts/pipelines/GovernQueue.sol/GovernQueue.json eventHandlers: - event: Executed(indexed address,(address,uint256,bytes)[],bytes32,bytes32,bytes[]) handler: handleExecuted + - event: ETHDeposited(address,uint256) + handler: handleETHDeposited + - event: Deposited(indexed address,indexed address,uint256,string) + handler: handleDeposited + - event: Withdrawn(indexed address,indexed address,address,uint256,string) + handler: handleWithdrawn - event: Frozen(indexed bytes4,indexed address) handler: handleFrozen - event: Granted(indexed bytes4,indexed address,indexed address,address) handler: handleGranted - event: Revoked(indexed bytes4,indexed address,indexed address) handler: handleRevoked - file: ./src/Govern.ts + file: ./src/Govern.ts \ No newline at end of file diff --git a/packages/govern-token/.gitignore b/packages/govern-token/.gitignore index 2a7cc78af..f45a3ec3a 100644 --- a/packages/govern-token/.gitignore +++ b/packages/govern-token/.gitignore @@ -6,6 +6,7 @@ cache artifacts typechain deployments +abi #Coverage coverage/ diff --git a/packages/govern-token/README.md b/packages/govern-token/README.md index 5576f105d..4f98ac842 100644 --- a/packages/govern-token/README.md +++ b/packages/govern-token/README.md @@ -7,12 +7,12 @@ This package contains the contracts for Token. First, run `yarn` to install all the dependencies, if it hasn't been run before for any other package. Then, create the `.env` file in the root directory of this package and include those: -* `PRIVATE_KEY=YOUR_PRIVATE_KEY` -`PRIVATE_KEY` is necessary to make sure you can deploy contracts. +- `PRIVATE_KEY=YOUR_PRIVATE_KEY` +`PRIVATE_KEY` is necessary to make sure you can deploy contracts. # Deployment -* `yarn deploy` deploys `GovernTokenFactory` contract. -* `yarn deploy-token` deploys the actual token. To know which arguments to pass in (such as name, symbol, e.t.c.), see `tasks/token.js` \ No newline at end of file +- `yarn deploy` deploys `GovernTokenFactory` contract. +- `yarn deploy-token` deploys the actual token. To know which arguments to pass in (such as name, symbol, e.t.c.), see `tasks/token.js` diff --git a/packages/govern-token/contracts/GovernTokenFactory.sol b/packages/govern-token/contracts/GovernTokenFactory.sol index 2c8d517b6..f245cd110 100644 --- a/packages/govern-token/contracts/GovernTokenFactory.sol +++ b/packages/govern-token/contracts/GovernTokenFactory.sol @@ -6,6 +6,8 @@ pragma solidity 0.6.8; pragma experimental ABIEncoderV2; import "@aragon/govern-contract-utils/contracts/minimal-proxies/ERC1167ProxyFactory.sol"; +import "./libraries/TokenLib.sol"; + import "erc3k/contracts/IERC3000Executor.sol"; import "./GovernToken.sol"; @@ -27,25 +29,21 @@ contract GovernTokenFactory { function newToken( IERC3000Executor _governExecutor, - string calldata _tokenName, - string calldata _tokenSymbol, - uint8 _tokenDecimals, - address _mintAddr, - uint256 _mintAmount, + TokenLib.TokenConfig calldata _token, bool _useProxies ) external returns ( GovernToken token, GovernMinter minter ) { if (!_useProxies) { - (token, minter) = _deployContracts(_tokenName, _tokenSymbol, _tokenDecimals); + (token, minter) = _deployContracts(_token.tokenName, _token.tokenSymbol, _token.tokenDecimals); } else { token = GovernToken(tokenBase.clone(abi.encodeWithSelector( token.initialize.selector, address(this), - _tokenName, - _tokenSymbol, - _tokenDecimals + _token.tokenName, + _token.tokenSymbol, + _token.tokenDecimals ))); minter = GovernMinter(minterBase.clone(abi.encodeWithSelector( minter.initialize.selector, @@ -56,7 +54,14 @@ contract GovernTokenFactory { } token.changeMinter(address(minter)); - if (_mintAmount > 0) minter.mint(_mintAddr, _mintAmount, "initial mint"); + + if (_token.mintAmount > 0) { + minter.mint(_token.mintAddress, _token.mintAmount, "initial mint"); + } + + if (_token.merkleRoot != bytes32(0)) { + minter.merkleMint(_token.merkleRoot, _token.merkleMintAmount, _token.merkleTree, _token.merkleContext); + } bytes4 mintRole = minter.mint.selector ^ minter.merkleMint.selector; bytes4 rootRole = minter.ROOT_ROLE(); diff --git a/packages/govern-token/contracts/libraries/TokenLib.sol b/packages/govern-token/contracts/libraries/TokenLib.sol new file mode 100644 index 000000000..377ade7c6 --- /dev/null +++ b/packages/govern-token/contracts/libraries/TokenLib.sol @@ -0,0 +1,25 @@ +/* + * SPDX-License-Identifier: MIT + */ + +pragma solidity ^0.6.8; + +import "../interfaces/IERC20.sol"; + +library TokenLib { + + struct TokenConfig { + IERC20 tokenAddress; + uint8 tokenDecimals; + string tokenName; + string tokenSymbol; + address mintAddress; // initial minter address + uint256 mintAmount; // how much to mint to initial minter address + // merkle settings + bytes32 merkleRoot; // merkle distribution root. + uint256 merkleMintAmount; // how much to mint for the distributor. + bytes merkleTree; // merkle tree object + bytes merkleContext; // context/string what's the actual reason is... + } + +} diff --git a/packages/govern-token/deploy/factory.ts b/packages/govern-token/deploy/factory.ts index 7d50c2a87..f9b15ed33 100644 --- a/packages/govern-token/deploy/factory.ts +++ b/packages/govern-token/deploy/factory.ts @@ -12,7 +12,6 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, deterministicDeployment: true, }) - } export default func diff --git a/packages/govern-token/hardhat.config.ts b/packages/govern-token/hardhat.config.ts index 171ae9c2e..8bbec7f60 100644 --- a/packages/govern-token/hardhat.config.ts +++ b/packages/govern-token/hardhat.config.ts @@ -5,6 +5,7 @@ import { HardhatUserConfig } from 'hardhat/types' import '@nomiclabs/hardhat-ethers' import '@nomiclabs/hardhat-etherscan' import '@nomiclabs/hardhat-waffle' +import 'hardhat-abi-exporter' import 'hardhat-deploy' import 'hardhat-typechain' import 'solidity-coverage' @@ -12,7 +13,9 @@ import './tasks/token' dotenvConfig({ path: resolve(__dirname, './.env') }) -const PRIV_KEYS = process.env.PRIVATE_KEY ? [`0x${process.env.PRIVATE_KEY}`] : []; +const PRIV_KEYS = process.env.PRIVATE_KEY + ? [`0x${process.env.PRIVATE_KEY}`] + : [] const config: HardhatUserConfig = { solidity: { @@ -39,8 +42,9 @@ const config: HardhatUserConfig = { allowUnlimitedContractSize: true, blockGasLimit: 0x1fffffffffffff, accounts: { - mnemonic: 'test test test test test test test test test test test junk' - } + mnemonic: 'test test test test test test test test test test test junk', + }, + gas: 'auto', }, coverage: { url: 'http://localhost:8555', @@ -48,11 +52,11 @@ const config: HardhatUserConfig = { }, mainnet: { url: 'https://mainnet.eth.aragon.network', - accounts: PRIV_KEYS + accounts: PRIV_KEYS, }, rinkeby: { url: 'https://rinkeby.eth.aragon.network', - accounts: PRIV_KEYS + accounts: PRIV_KEYS, }, }, } diff --git a/packages/govern-token/lib/utils.js b/packages/govern-token/lib/utils.js index cdc6458aa..6899eb731 100644 --- a/packages/govern-token/lib/utils.js +++ b/packages/govern-token/lib/utils.js @@ -6,4 +6,3 @@ const format = ({ address }, name) => const print = (contract, name) => console.log(format(contract, name)) module.exports = { format, print } - diff --git a/packages/govern-token/package.json b/packages/govern-token/package.json index 97a03248e..c9dd024e0 100644 --- a/packages/govern-token/package.json +++ b/packages/govern-token/package.json @@ -31,7 +31,7 @@ "node-fetch": "^2.6.1", "ethers": "^5.0.0", "unique-names-generator": "^4.3.1", - "hardhat-deploy": "^0.7.0-beta.37", + "hardhat-deploy": "^0.7.2", "hardhat-typechain": "^0.3.3", "solidity-coverage": "^0.7.15", "typechain": "3.0.0", diff --git a/packages/govern-token/tasks/token.js b/packages/govern-token/tasks/token.js index 92b746ae8..e4af4cbf7 100644 --- a/packages/govern-token/tasks/token.js +++ b/packages/govern-token/tasks/token.js @@ -1,16 +1,17 @@ -const { task } = require('hardhat/config') -const { print } = require('../lib/utils') +const { task } = require('hardhat/config') +const { print } = require('../lib/utils') const { BigNumber } = require('ethers') - function decimalAmount(amount, decimals) { - return BigNumber.from(amount).mul(BigNumber.from(10).pow(BigNumber.from(decimals))); + return BigNumber.from(amount).mul( + BigNumber.from(10).pow(BigNumber.from(decimals)) + ) } /** - * NOTE: + * NOTE: * initialminter and minteraddress can be different. so we have to provide them separately. - * + * * As an example of how to run this task: * yarn deploy-token --initialminter 0x94C34FB5025e054B24398220CBDaBE901bd8eE5e --minteraddress 0x94C34FB5025e054B24398220CBDaBE901bd8eE5e --mintamount 100 */ @@ -22,39 +23,55 @@ task('deploy-token', 'Uses factory to deploy a token and minter instances') .addOptionalParam('decimals', 'Token decimals') .addOptionalParam('minteraddress', 'Minter address') .addOptionalParam('mintamount', 'Amount of token to mint for the mintAddress') - .addOptionalParam('useProxies', 'Whether to deploy token and minter with proxies') + .addOptionalParam( + 'useProxies', + 'Whether to deploy token and minter with proxies' + ) .setAction( - async( - { - factory: factoryAddr, - initialminter:initialMinter, - name: name = 'Govern Token', - symbol: symbol = 'GOV', - decimals: decimals = 18, - minteraddress: minterAddress, - mintamount: mintAmount = 0, - useProxies: useProxies = false - }, - HRE + async ( + { + factory: factoryAddr, + initialminter: initialMinter, + name: name = 'Govern Token', + symbol: symbol = 'GOV', + decimals: decimals = 18, + minteraddress: minterAddress, + mintamount: mintAmount = 0, + useProxies: useProxies = false, + }, + HRE ) => { - - const { ethers, deployments } = HRE + const { ethers, deployments } = HRE + + const tokenFactoryDeployment = await deployments.get('GovernTokenFactory') + const tokenFactory = factoryAddr + ? await ethers.getContractAt('GovernTokenFactory', factoryAddr) + : await ethers.getContractAt( + 'GovernTokenFactory', + tokenFactoryDeployment.address + ) - const tokenFactoryDeployment = await deployments.get('GovernTokenFactory'); - const tokenFactory = factoryAddr ? await ethers.getContractAt('GovernTokenFactory', factoryAddr) - : await ethers.getContractAt('GovernTokenFactory', tokenFactoryDeployment.address) - - mintAmount = decimalAmount(mintAmount, decimals) + mintAmount = decimalAmount(mintAmount, decimals) - const tx = await tokenFactory.newToken(initialMinter, name, symbol, decimals, minterAddress, mintAmount , useProxies, { - gasLimit: useProxies ? 5e5 : 5e6, - }) + const tx = await tokenFactory.newToken( + initialMinter, + name, + symbol, + decimals, + minterAddress, + mintAmount, + useProxies, + { + gasLimit: useProxies ? 5e5 : 5e6, + } + ) - const { events } = await tx.wait() - const { token, minter } = events.find(({ event }) => event === 'CreatedToken').args + const { events } = await tx.wait() + const { token, minter } = events.find( + ({ event }) => event === 'CreatedToken' + ).args - print({ address: token }, 'GovernToken') - print({ address: minter }, 'GovernMinter') - + print({ address: token }, 'GovernToken') + print({ address: minter }, 'GovernMinter') } ) diff --git a/packages/govern-token/test/govern-token-factory.js b/packages/govern-token/test/govern-token-factory.js index 9d1c3d9fa..4fb02cf2b 100644 --- a/packages/govern-token/test/govern-token-factory.js +++ b/packages/govern-token/test/govern-token-factory.js @@ -1,108 +1,223 @@ const { formatBytes32String } = require('ethers/lib/utils') -const { expect } = require('chai'); +const { expect } = require('chai') +const BalanceTree = require('./helpers/merkle-tree/balance-tree').default +const { BigNumber } = require('ethers') const EVENTS = { - MINTED_SINGLE: 'MintedSingle', + MINTED_SINGLE: 'MintedSingle', + MINTED_MERKLE: 'MintedMerkle', + CREATED_TOKEN: 'CreatedToken' } const ERRORS = { - ACL_AUTH: 'acl: auth' + ACL_AUTH: 'acl: auth', + PROOF_FAILED: 'dist: proof failed' } describe('GovernTokenFactory', function () { - let signers, - owner, - governExecutor, - mintAddr, - governTokenFactory + let signers, owner, governExecutor, mintAddr, governTokenFactory + let wallet0, wallet1 // distrubutor addresses + let zero32Bytes = '0x'+'00'.repeat(32) + + before(async () => { + signers = await ethers.getSigners() + owner = await signers[0].getAddress() + governExecutor = await signers[1].getAddress() + mintAddr = await signers[2].getAddress() + + wallet0 = await signers[3].getAddress() + wallet1 = await signers[4].getAddress() + + + const tokenFactoryArtifact = await hre.artifacts.readArtifact('GovernTokenFactory'); + const minterArtifact = await hre.artifacts.readArtifact('GovernMinter'); + + const mergedAbi = [ + ...tokenFactoryArtifact.abi, + ...minterArtifact.abi.filter((f) => f.type === 'event' && f.name === EVENTS.MINTED_MERKLE) + ] + const GovernTokenFactory = new ethers.ContractFactory(mergedAbi, tokenFactoryArtifact.bytecode, signers[0]); + governTokenFactory = await GovernTokenFactory.deploy(); + }) + + async function getTokenAndMinter(tx) { + const { events } = await tx.wait() + const { token, minter } = events.find( + ({ event }) => event === EVENTS.CREATED_TOKEN + ).args + return { + token: await ethers.getContractAt('GovernToken', token), + minter: await ethers.getContractAt('GovernMinter', minter), + } + } + + async function getMerkleDistributor(tx) { + const { events } = await tx.wait(); + try { + const { distributor } = events.find( + ({ event }) => event === EVENTS.MINTED_MERKLE + ).args + return ethers.getContractAt('MerkleDistributor', distributor); + }catch(err) { + return null; + } + } + + let options = [ + { + title: 'Deploys token and minter with proxies', + params: { + useProxies: true, + }, + }, + { + title: 'Deploys token and minter without proxies', + params: { + useProxies: false, + }, + }, + ] + + // The following `options` tests should directly mimic to each other, since + // changing `useProxies` parameter shouldn't affect anything in terms of logic + // but with only gas costs. + options.forEach((item) => { + describe(item.title, async () => { + let token, minter, merkleDistributor, tx + let mintedAmount = 100 + let distributorMintedAmount = 10000 + let tree + + before(async () => { + tree = new BalanceTree([ + { account: wallet0, amount: BigNumber.from(100) }, + { account: wallet1, amount: BigNumber.from(101) }, + ]) + + tx = await governTokenFactory.newToken( + governExecutor, + [ + '0x'+'0'.repeat(40), + 18, + "TokenName", + "TokenSymbol", + mintAddr, + mintedAmount, + zero32Bytes, + 0, + '0x', + '0x' + ], + item.useProxies + ) + const data = await getTokenAndMinter(tx) + token = data.token + minter = data.minter + merkleDistributor = await getMerkleDistributor(tx) + }) + + it('should not create merkle distributor when zero merkle root is passed', async () => { + expect(merkleDistributor).to.equal(null) + }) + + it('checks if amount is minted and minter is the correct minter', async () => { + expect(await token.balanceOf(mintAddr)).to.equal(mintedAmount) + expect(await token.minter()).to.equal(minter.address) + await expect(tx) + .to.emit(minter, EVENTS.MINTED_SINGLE) + // initial mint is 12 length, in bytes, it's 24 and plus 0x (overal 26) + .withArgs( + mintAddr, + mintedAmount, + formatBytes32String('initial mint').slice(0, 26) + ) + }) + + it('reverts if the mint is not called from GovernExecutor', async () => { + let tx = minter.mint(mintAddr, mintedAmount, '0x') + await expect(tx).to.be.revertedWith(ERRORS.ACL_AUTH) + }) + + it('reverts if root role function is not called from GovernExecutor', async () => { + let tx = minter.grant(minter.interface.getSighash('mint'), owner) + await expect(tx).to.be.revertedWith(ERRORS.ACL_AUTH) + }) + + it('succeeds if mint is called from the GovernExecutor', async () => { + minter = minter.connect(signers[1]) // governExecutor + let tx = minter.mint(mintAddr, mintedAmount, '0x') + await expect(tx) + .to.emit(minter, EVENTS.MINTED_SINGLE) + .withArgs(mintAddr, mintedAmount, '0x') + }) + + it('succeeds if root role function is called from GovernExecutor', async () => { + minter = minter.connect(signers[1]) // governExecutor + let mintSelector = minter.interface.getSighash('mint') + await minter.grant(mintSelector, owner) + expect(await minter.roles(mintSelector, owner)).not.equal( + `0x${'0'.repeat(40)}` + ) + }) + }) + }) + + + describe('deploys with merkle distributor', async () => { + let token, minter, merkleDistributor, tx + let mintedAmount = 100 + let distributorMintedAmount = 200 + let tree before(async () => { - signers = await ethers.getSigners() - owner = await signers[0].getAddress(); - governExecutor = await signers[1].getAddress(); - mintAddr = await signers[2].getAddress(); + tree = new BalanceTree([ + { account: wallet0, amount: BigNumber.from(100) }, + { account: wallet1, amount: BigNumber.from(100) }, + ]) - const GovernTokenFactory = await ethers.getContractFactory('GovernTokenFactory') - governTokenFactory = await GovernTokenFactory.deploy(); + tx = await governTokenFactory.newToken( + governExecutor, + [ + '0x'+'0'.repeat(40), + 18, + "TokenName", + "TokenSymbol", + mintAddr, + mintedAmount, + tree.getHexRoot(), + distributorMintedAmount, + '0x00', + '0x11' + ], + true + ) + const data = await getTokenAndMinter(tx) + token = data.token + minter = data.minter + merkleDistributor = await getMerkleDistributor(tx) }) - async function getTokenAndMinter(tx) { - const { events } = await tx.wait() - const { token, minter } = events.find(({ event }) => event === 'CreatedToken').args - return { - token: (await ethers.getContractAt('GovernToken', token)), - minter: (await ethers.getContractAt('GovernMinter', minter)) - } - } + it('creates merkle distributor when non zero merkle root is passed', async () => { + await expect(tx) + .to.emit(minter, EVENTS.MINTED_MERKLE) + .withArgs( + merkleDistributor.address, + tree.getHexRoot(), + distributorMintedAmount, + "0x00", + "0x11" + ) + expect(await token.balanceOf(merkleDistributor.address)).to.equal(distributorMintedAmount) + + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)); + + await expect(await merkleDistributor.claim(0, wallet0, 100, proof0)) + .to.emit(merkleDistributor, 'Claimed') + .withArgs(0, wallet0, 100) - let options = [ - { - title: "Deploys token and minter with proxies", - params: { - useProxies: true - } - }, - { - title: "Deploys token and minter without proxies", - params: { - useProxies: false - } - } - ]; - - options.forEach(item => { - describe(item.title, async () => { - let token, minter, tx - let mintedAmount = 100 - - before(async () => { - tx = await governTokenFactory.newToken( - governExecutor, - "TokenName", - "TokenSymbol", - 18, - mintAddr, - mintedAmount, - item.useProxies - ); - const data = await getTokenAndMinter(tx); - token = data.token; - minter = data.minter; - }) - - it("checks if amount is minted and minter is the correct minter", async () => { - expect(await token.balanceOf(mintAddr)).to.equal(mintedAmount); - expect(await token.minter()).to.equal(minter.address); - await expect(tx) - .to.emit(minter, EVENTS.MINTED_SINGLE) - // initial mint is 12 length, in bytes, it's 24 and plus 0x (overal 26) - .withArgs(mintAddr, mintedAmount, formatBytes32String("initial mint").slice(0, 26)) - }) - - it("reverts if the mint is not called from GovernExecutor", async () => { - let tx = minter.mint(mintAddr, mintedAmount, "0x"); - await expect(tx).to.be.revertedWith(ERRORS.ACL_AUTH); - }) - - it("reverts if root role function is not called from GovernExecutor", async () => { - let tx = minter.grant(minter.interface.getSighash('mint'), owner) - await expect(tx).to.be.revertedWith(ERRORS.ACL_AUTH); - }) - - it("succeeds if mint is called from the GovernExecutor", async () => { - minter = minter.connect(signers[1]); // governExecutor - let tx = minter.mint(mintAddr, mintedAmount, "0x"); - await expect(tx) - .to.emit(minter, EVENTS.MINTED_SINGLE) - .withArgs(mintAddr, mintedAmount, "0x") - }) - - it("succeeds if root role function is called from GovernExecutor", async () => { - minter = minter.connect(signers[1]); // governExecutor - let mintSelector = minter.interface.getSighash('mint'); - await minter.grant(mintSelector, owner); - expect(await minter.roles(mintSelector, owner)).not.equal(`0x${'0'.repeat(40)}`) - }) - }) + await expect(merkleDistributor.claim(2, wallet0, 100, proof0)).to.be.revertedWith(ERRORS.PROOF_FAILED) + + expect(await merkleDistributor.merkleRoot()).to.equal(tree.getHexRoot()) }) + }) }) diff --git a/packages/govern-token/test/govern-token.js b/packages/govern-token/test/govern-token.js index 34d5f949c..7ec30fa90 100644 --- a/packages/govern-token/test/govern-token.js +++ b/packages/govern-token/test/govern-token.js @@ -1,26 +1,29 @@ const { keccak256, toUtf8Bytes, SigningKey } = require('ethers/lib/utils') -const { ZERO_ADDRESS } = require('@aragon/contract-helpers-test') -const { createDomainSeparator } = require('./helpers/erc712') -const { createPermitDigest, PERMIT_TYPEHASH } = require('./helpers/erc2612') -const { createTransferWithAuthorizationDigest, TRANSFER_WITH_AUTHORIZATION_TYPEHASH } = require('./helpers/erc3009') -const { BigNumber } = require('ethers') -const { expect } = require('chai'); +const { ZERO_ADDRESS } = require('@aragon/contract-helpers-test') +const { createDomainSeparator } = require('./helpers/erc712') +const { createPermitDigest, PERMIT_TYPEHASH } = require('./helpers/erc2612') +const { + createTransferWithAuthorizationDigest, + TRANSFER_WITH_AUTHORIZATION_TYPEHASH, +} = require('./helpers/erc3009') +const { BigNumber } = require('ethers') +const { expect } = require('chai') const MAX_UINT256 = ethers.constants.MaxUint256 -describe('GovernToken', async function () { +describe('GovernToken', async function () { let token let signers let minter, newMinter, holder1, holder2, newHolder let GovernToken - + before(async () => { - signers = await ethers.getSigners() - minter = await signers[0].getAddress(); - newMinter = await signers[1].getAddress(); - holder1 = await signers[2].getAddress(); - holder2 = await signers[3].getAddress(); - newHolder = await signers[4].getAddress(); + signers = await ethers.getSigners() + minter = await signers[0].getAddress() + newMinter = await signers[1].getAddress() + holder1 = await signers[2].getAddress() + holder2 = await signers[3].getAddress() + newHolder = await signers[4].getAddress() GovernToken = await ethers.getContractFactory('GovernToken') }) @@ -30,8 +33,8 @@ describe('GovernToken', async function () { const isBurn = to === ZERO_ADDRESS const prevFromBal = await token.balanceOf(from) - const prevToBal = await token.balanceOf(to) - const prevSupply = await token.totalSupply() + const prevToBal = await token.balanceOf(to) + const prevSupply = await token.totalSupply() const receipt = await fn(from, to, value) @@ -53,8 +56,10 @@ describe('GovernToken', async function () { async function itApprovesCorrectly(fn, { owner, spender, value }) { const receipt = await fn(owner, spender, value) - expect(await token.allowance(owner, spender)).to.equal(value); - await expect(receipt).to.emit(token, 'Approval').withArgs(owner, spender, value); + expect(await token.allowance(owner, spender)).to.equal(value) + await expect(receipt) + .to.emit(token, 'Approval') + .withArgs(owner, spender, value) } beforeEach('deploy GovernToken', async () => { @@ -65,63 +70,62 @@ describe('GovernToken', async function () { }) it('set up the token correctly', async () => { - expect(await token.name()).to.equal("Aragon Network Token") - expect(await token.symbol()).to.equal("ANT") + expect(await token.name()).to.equal('Aragon Network Token') + expect(await token.symbol()).to.equal('ANT') expect(await token.decimals()).to.equal(18) - expect(await token.totalSupply()).to.equal(BigNumber.from(300)) - expect(await token.balanceOf(holder1)).to.equal(BigNumber.from(100)); - expect(await token.balanceOf(holder2)).to.equal(BigNumber.from(200)); + expect(await token.balanceOf(holder1)).to.equal(BigNumber.from(100)) + expect(await token.balanceOf(holder2)).to.equal(BigNumber.from(200)) }) context('mints', () => { context('is minter', () => { it('can mint tokens', async () => { - await itTransfersCorrectly( - (_, to, value) => token.mint(to, value), - { - from: ZERO_ADDRESS, - to: newHolder, - value: BigNumber.from(100) - } - ) + await itTransfersCorrectly((_, to, value) => token.mint(to, value), { + from: ZERO_ADDRESS, + to: newHolder, + value: BigNumber.from(100), + }) }) it('can change minter', async () => { - const receipt = await token.changeMinter(newMinter); - expect(await token.minter()).to.equal(newMinter); - await expect(receipt).to.emit(token, 'ChangeMinter').withArgs(newMinter); + const receipt = await token.changeMinter(newMinter) + expect(await token.minter()).to.equal(newMinter) + await expect(receipt).to.emit(token, 'ChangeMinter').withArgs(newMinter) }) }) context('not minter', () => { it('cannot mint tokens', async () => { token = token.connect(signers[2]) // holder1 - await expect(token.mint(newHolder, BigNumber.from(100))).to.be.revertedWith('token: not minter'); + await expect( + token.mint(newHolder, BigNumber.from(100)) + ).to.be.revertedWith('token: not minter') }) it('cannot change minter', async () => { token = token.connect(signers[2]) // holder1 - await expect(token.changeMinter(newHolder)).to.be.revertedWith('token: not minter'); + await expect(token.changeMinter(newHolder)).to.be.revertedWith( + 'token: not minter' + ) }) }) }) context('transfers', () => { context('holds bag', () => { - beforeEach(() => { token = token.connect(signers[2]) // holder1 }) - + it('can transfer tokens', async () => { await itTransfersCorrectly( (from, to, value) => token.transfer(to, value), { from: holder1, to: newHolder, - value: (await token.balanceOf(holder1)).sub(BigNumber.from(1)) + value: (await token.balanceOf(holder1)).sub(BigNumber.from(1)), } ) }) @@ -132,32 +136,39 @@ describe('GovernToken', async function () { { from: holder1, to: newHolder, - value: await token.balanceOf(holder1) + value: await token.balanceOf(holder1), } ) }) it('cannot transfer above balance', async () => { const balance = (await token.balanceOf(holder1)).add(BigNumber.from(1)) - await expect(token.transfer(newHolder, balance)).to.be.revertedWith('math: underflow'); + await expect(token.transfer(newHolder, balance)).to.be.revertedWith( + 'math: underflow' + ) }) it('cannot transfer to token', async () => { - await expect(token.transfer(token.address, BigNumber.from(1))).to.be.revertedWith('token: bad to'); + await expect( + token.transfer(token.address, BigNumber.from(1)) + ).to.be.revertedWith('token: bad to') }) it('cannot transfer to zero address', async () => { - await expect(token.transfer(ZERO_ADDRESS, BigNumber.from(1))).to.be.revertedWith('token: bad to'); + await expect( + token.transfer(ZERO_ADDRESS, BigNumber.from(1)) + ).to.be.revertedWith('token: bad to') }) }) context('bagless', () => { - beforeEach(() => { - token = token.connect(signers[4]); // newHolder + token = token.connect(signers[4]) // newHolder }) it('cannot transfer any', async () => { - await expect(token.transfer(holder1, BigNumber.from(1))).to.be.revertedWith('math: underflow'); + await expect( + token.transfer(holder1, BigNumber.from(1)) + ).to.be.revertedWith('math: underflow') }) }) }) @@ -167,21 +178,21 @@ describe('GovernToken', async function () { let spender before(() => { - owner = holder1; - spender = newHolder; + owner = holder1 + spender = newHolder }) context('has allowance', () => { const value = BigNumber.from(50) beforeEach(async () => { - token = token.connect(signers[2]); // holder1 - await token.approve(spender, value); - token = token.connect(signers[4]); // newHolder + token = token.connect(signers[2]) // holder1 + await token.approve(spender, value) + token = token.connect(signers[4]) // newHolder }) it('can change allowance', async () => { - token = token.connect(signers[2]); // holder1 + token = token.connect(signers[2]) // holder1 await itApprovesCorrectly( (owner, spender, value) => token.approve(spender, value), { owner, spender, value: value.add(BigNumber.from(10)) } @@ -194,7 +205,7 @@ describe('GovernToken', async function () { { from: owner, to: spender, - value: value.sub(BigNumber.from(1)) + value: value.sub(BigNumber.from(1)), } ) }) @@ -205,25 +216,29 @@ describe('GovernToken', async function () { { from: owner, to: spender, - value: value.sub(BigNumber.from(1)) + value: value.sub(BigNumber.from(1)), } ) }) it('cannot transfer above balance', async () => { - await expect(token.transferFrom(owner, spender, value.add(BigNumber.from(1)))).to.be.revertedWith('math: underflow'); - + await expect( + token.transferFrom(owner, spender, value.add(BigNumber.from(1))) + ).to.be.revertedWith('math: underflow') }) it('cannot transfer to token', async () => { - await expect(token.transferFrom(owner, token.address, BigNumber.from(1))).to.be.revertedWith('token: bad to'); + await expect( + token.transferFrom(owner, token.address, BigNumber.from(1)) + ).to.be.revertedWith('token: bad to') }) it('cannot transfer to zero address', async () => { - await expect(token.transferFrom(owner, ZERO_ADDRESS, BigNumber.from(1))).to.be.revertedWith('token: bad to'); + await expect( + token.transferFrom(owner, ZERO_ADDRESS, BigNumber.from(1)) + ).to.be.revertedWith('token: bad to') }) }) - context('has infinity allowance', () => { beforeEach(async () => { @@ -245,22 +260,24 @@ describe('GovernToken', async function () { { from: owner, to: spender, - value: await token.balanceOf(owner) + value: await token.balanceOf(owner), } ) - expect(await token.allowance(owner,spender)).to.equal(MAX_UINT256); + expect(await token.allowance(owner, spender)).to.equal(MAX_UINT256) }) it('cannot transfer above balance', async () => { - token = token.connect(signers[4]); + token = token.connect(signers[4]) const balance = (await token.balanceOf(owner)).add(BigNumber.from('1')) - await expect(token.transferFrom(owner, spender, balance)).to.be.revertedWith('math: underflow'); + await expect( + token.transferFrom(owner, spender, balance) + ).to.be.revertedWith('math: underflow') }) }) context('no allowance', () => { it('can increase allowance', async () => { - token = token.connect(signers[2]); // holder1 + token = token.connect(signers[2]) // holder1 await itApprovesCorrectly( (owner, spender, value) => token.approve(spender, value), { owner, spender, value: BigNumber.from(10) } @@ -268,45 +285,39 @@ describe('GovernToken', async function () { }) it('cannot transfer', async () => { - token = token.connect(signers[4]); // newHolder - await expect(token.transferFrom(owner, spender, BigNumber.from(1))).to.be.revertedWith('math: underflow'); + token = token.connect(signers[4]) // newHolder + await expect( + token.transferFrom(owner, spender, BigNumber.from(1)) + ).to.be.revertedWith('math: underflow') }) }) }) - context('burns', () => { context('holds bag', () => { - beforeEach(() => { token = token.connect(signers[2]) // holder1 }) it('can burn tokens', async () => { - await itTransfersCorrectly( - (from, to, value) => token.burn(value), - { - from: holder1, - to: ZERO_ADDRESS, - value: (await token.balanceOf(holder1)).sub(BigNumber.from(1)) - } - ) + await itTransfersCorrectly((from, to, value) => token.burn(value), { + from: holder1, + to: ZERO_ADDRESS, + value: (await token.balanceOf(holder1)).sub(BigNumber.from(1)), + }) }) it('can burn all tokens', async () => { - await itTransfersCorrectly( - (from, to, value) => token.burn(value), - { - from: holder1, - to: ZERO_ADDRESS, - value: await token.balanceOf(holder1) - } - ) + await itTransfersCorrectly((from, to, value) => token.burn(value), { + from: holder1, + to: ZERO_ADDRESS, + value: await token.balanceOf(holder1), + }) }) it('cannot burn above balance', async () => { - const value = (await token.balanceOf(holder1)).add(BigNumber.from(1)); - await expect(token.burn(value)).to.be.revertedWith('math: underflow'); + const value = (await token.balanceOf(holder1)).add(BigNumber.from(1)) + await expect(token.burn(value)).to.be.revertedWith('math: underflow') }) }) @@ -316,32 +327,27 @@ describe('GovernToken', async function () { }) it('cannot burn any', async () => { - await expect(token.burn(BigNumber.from(1))).to.be.revertedWith('math: underflow'); + await expect(token.burn(BigNumber.from(1))).to.be.revertedWith( + 'math: underflow' + ) }) }) it('can burn all tokens', async () => { token = token.connect(signers[2]) // holder1 - await itTransfersCorrectly( - (from, to, value) => token.burn(value), - { - from: holder1, - to: ZERO_ADDRESS, - value: await token.balanceOf(holder1) - } - ) + await itTransfersCorrectly((from, to, value) => token.burn(value), { + from: holder1, + to: ZERO_ADDRESS, + value: await token.balanceOf(holder1), + }) token = token.connect(signers[3]) // holder2 - await itTransfersCorrectly( - (from, to, value) => token.burn(value), - { - from: holder2, - to: ZERO_ADDRESS, - value: await token.balanceOf(holder2) - } - ) - - expect(await token.totalSupply()).to.equal(0); + await itTransfersCorrectly((from, to, value) => token.burn(value), { + from: holder2, + to: ZERO_ADDRESS, + value: await token.balanceOf(holder2), + }) + expect(await token.totalSupply()).to.equal(0) }) }) @@ -353,8 +359,8 @@ describe('GovernToken', async function () { await token.getChainId(), token.address ) - - expect(await token.getDomainSeparator()).to.equal(domainSeparator); + + expect(await token.getDomainSeparator()).to.equal(domainSeparator) }) }) @@ -362,16 +368,29 @@ describe('GovernToken', async function () { let owner, ownerPrivKey let spender - async function createPermitSignature(owner, spender, value, nonce, deadline) { - const digest = await createPermitDigest(token, owner, spender, value, nonce, deadline) + async function createPermitSignature( + owner, + spender, + value, + nonce, + deadline + ) { + const digest = await createPermitDigest( + token, + owner, + spender, + value, + nonce, + deadline + ) + + const { r, s, v } = new SigningKey(ownerPrivKey).signDigest(digest) - const { r, s, v } = new SigningKey(ownerPrivKey).signDigest(digest); - return { r, s, v } } before(async () => { - const wallet = ethers.Wallet.createRandom(); + const wallet = ethers.Wallet.createRandom() owner = wallet.address ownerPrivKey = wallet.privateKey spender = newHolder @@ -383,43 +402,100 @@ describe('GovernToken', async function () { }) it('has the correct permit typehash', async () => { - expect(await token.PERMIT_TYPEHASH()).to.equal(PERMIT_TYPEHASH); + expect(await token.PERMIT_TYPEHASH()).to.equal(PERMIT_TYPEHASH) }) it('can set allowance through permit', async () => { - const deadline = MAX_UINT256; - + const deadline = MAX_UINT256 + const firstValue = BigNumber.from(100) const firstNonce = await token.nonces(owner) - const firstSig = await createPermitSignature(owner, spender, firstValue, firstNonce, deadline) - const firstReceipt = await token.permit(owner, spender, firstValue, deadline, firstSig.v, firstSig.r, firstSig.s) + const firstSig = await createPermitSignature( + owner, + spender, + firstValue, + firstNonce, + deadline + ) + const firstReceipt = await token.permit( + owner, + spender, + firstValue, + deadline, + firstSig.v, + firstSig.r, + firstSig.s + ) expect(await token.allowance(owner, spender)).to.equal(firstValue) - expect(await token.nonces(owner)).to.equal(firstNonce.add(BigNumber.from(1))) - await expect(firstReceipt).to.emit(token, 'Approval').withArgs(owner, spender, firstValue); + expect(await token.nonces(owner)).to.equal( + firstNonce.add(BigNumber.from(1)) + ) + await expect(firstReceipt) + .to.emit(token, 'Approval') + .withArgs(owner, spender, firstValue) const secondValue = BigNumber.from(500) const secondNonce = await token.nonces(owner) - const secondSig = await createPermitSignature(owner, spender, secondValue, secondNonce, deadline) - const secondReceipt = await token.permit(owner, spender, secondValue, deadline, secondSig.v, secondSig.r, secondSig.s) + const secondSig = await createPermitSignature( + owner, + spender, + secondValue, + secondNonce, + deadline + ) + const secondReceipt = await token.permit( + owner, + spender, + secondValue, + deadline, + secondSig.v, + secondSig.r, + secondSig.s + ) expect(await token.allowance(owner, spender)).to.equal(secondValue) - expect(await token.nonces(owner)).to.equal(secondNonce.add(BigNumber.from(1))) - await expect(secondReceipt).to.emit(token, 'Approval').withArgs(owner, spender, secondValue); + expect(await token.nonces(owner)).to.equal( + secondNonce.add(BigNumber.from(1)) + ) + await expect(secondReceipt) + .to.emit(token, 'Approval') + .withArgs(owner, spender, secondValue) }) - it('cannot use wrong signature', async () => { - const deadline = MAX_UINT256; + const deadline = MAX_UINT256 const nonce = await token.nonces(owner) const firstValue = BigNumber.from(100) const secondValue = BigNumber.from(500) - const firstSig = await createPermitSignature(owner, spender, firstValue, nonce, deadline) - const secondSig = await createPermitSignature(owner, spender, secondValue, nonce, deadline) + const firstSig = await createPermitSignature( + owner, + spender, + firstValue, + nonce, + deadline + ) + const secondSig = await createPermitSignature( + owner, + spender, + secondValue, + nonce, + deadline + ) // Use a mismatching signature - await expect(token.permit(owner, spender, firstValue, deadline, secondSig.v, secondSig.r, secondSig.s)).to.be.revertedWith('token: bad sig') + await expect( + token.permit( + owner, + spender, + firstValue, + deadline, + secondSig.v, + secondSig.r, + secondSig.s + ) + ).to.be.revertedWith('token: bad sig') }) it('cannot use expired permit', async () => { @@ -427,11 +503,21 @@ describe('GovernToken', async function () { const nonce = await token.nonces(owner) // Use a prior deadline - const now = BigNumber.from((await ethers.provider.getBlock('latest')).timestamp) + const now = BigNumber.from( + (await ethers.provider.getBlock('latest')).timestamp + ) const deadline = now.sub(BigNumber.from(60)) - const { r, s, v } = await createPermitSignature(owner, spender, value, nonce, deadline) - await expect(token.permit(owner, spender, value, deadline, v, r, s)).to.be.revertedWith('token: auth expired') + const { r, s, v } = await createPermitSignature( + owner, + spender, + value, + nonce, + deadline + ) + await expect( + token.permit(owner, spender, value, deadline, v, r, s) + ).to.be.revertedWith('token: auth expired') }) it('cannot use surpassed permit', async () => { @@ -441,12 +527,42 @@ describe('GovernToken', async function () { // Generate two signatures with the same nonce and use one const firstValue = BigNumber.from(100) const secondValue = BigNumber.from(500) - const firstSig = await createPermitSignature(owner, spender, firstValue, nonce, deadline) - const secondSig = await createPermitSignature(owner, spender, secondValue, nonce, deadline) + const firstSig = await createPermitSignature( + owner, + spender, + firstValue, + nonce, + deadline + ) + const secondSig = await createPermitSignature( + owner, + spender, + secondValue, + nonce, + deadline + ) // Using one should disallow the other - await token.permit(owner, spender, secondValue, deadline, secondSig.v, secondSig.r, secondSig.s) - await expect(token.permit(owner, spender, firstValue, deadline, firstSig.v, firstSig.r, firstSig.s)).to.be.revertedWith('token: bad sig') + await token.permit( + owner, + spender, + secondValue, + deadline, + secondSig.v, + secondSig.r, + secondSig.s + ) + await expect( + token.permit( + owner, + spender, + firstValue, + deadline, + firstSig.v, + firstSig.r, + firstSig.s + ) + ).to.be.revertedWith('token: bad sig') }) }) @@ -454,11 +570,26 @@ describe('GovernToken', async function () { let from, ownerPrivKey let to - async function createTransferWithAuthorizationSignature(from, to, value, validBefore, validAfter, nonce) { - const digest = await createTransferWithAuthorizationDigest(token, from, to, value, validBefore, validAfter, nonce) + async function createTransferWithAuthorizationSignature( + from, + to, + value, + validBefore, + validAfter, + nonce + ) { + const digest = await createTransferWithAuthorizationDigest( + token, + from, + to, + value, + validBefore, + validAfter, + nonce + ) + + const { r, s, v } = new SigningKey(ownerPrivKey).signDigest(digest) - const { r, s, v } = new SigningKey(ownerPrivKey).signDigest(digest); - return { r, s, v } } @@ -475,7 +606,9 @@ describe('GovernToken', async function () { }) it('has the correct transferWithAuthorization typehash', async () => { - expect(await token.TRANSFER_WITH_AUTHORIZATION_TYPEHASH()).to.equal(TRANSFER_WITH_AUTHORIZATION_TYPEHASH); + expect(await token.TRANSFER_WITH_AUTHORIZATION_TYPEHASH()).to.equal( + TRANSFER_WITH_AUTHORIZATION_TYPEHASH + ) }) it('can transfer through transferWithAuthorization', async () => { @@ -484,41 +617,91 @@ describe('GovernToken', async function () { const firstNonce = keccak256(toUtf8Bytes('first')) const secondNonce = keccak256(toUtf8Bytes('second')) - expect(await token.authorizationState(from, firstNonce)).to.equal(false); - expect(await token.authorizationState(from, secondNonce)).to.equal(false); + expect(await token.authorizationState(from, firstNonce)).to.equal(false) + expect(await token.authorizationState(from, secondNonce)).to.equal(false) const firstValue = BigNumber.from(25) - const firstSig = await createTransferWithAuthorizationSignature(from, to, firstValue, validAfter, validBefore, firstNonce) + const firstSig = await createTransferWithAuthorizationSignature( + from, + to, + firstValue, + validAfter, + validBefore, + firstNonce + ) await itTransfersCorrectly( - () => token.transferWithAuthorization(from, to, firstValue, validAfter, validBefore, firstNonce, firstSig.v, firstSig.r, firstSig.s), + () => + token.transferWithAuthorization( + from, + to, + firstValue, + validAfter, + validBefore, + firstNonce, + firstSig.v, + firstSig.r, + firstSig.s + ), { from, to, value: firstValue } ) - expect(await token.authorizationState(from, firstNonce)).to.equal(true); + expect(await token.authorizationState(from, firstNonce)).to.equal(true) const secondValue = BigNumber.from(10) - const secondSig = await createTransferWithAuthorizationSignature(from, to, secondValue, validAfter, validBefore, secondNonce) + const secondSig = await createTransferWithAuthorizationSignature( + from, + to, + secondValue, + validAfter, + validBefore, + secondNonce + ) await itTransfersCorrectly( - () => token.transferWithAuthorization(from, to, secondValue, validAfter, validBefore, secondNonce, secondSig.v, secondSig.r, secondSig.s), + () => + token.transferWithAuthorization( + from, + to, + secondValue, + validAfter, + validBefore, + secondNonce, + secondSig.v, + secondSig.r, + secondSig.s + ), { from, to, value: secondValue } ) - expect(await token.authorizationState(from, secondNonce)).to.equal(true); + expect(await token.authorizationState(from, secondNonce)).to.equal(true) }) it('cannot transfer above balance', async () => { - const value = (await token.balanceOf(from)).add(BigNumber.from(1)); + const value = (await token.balanceOf(from)).add(BigNumber.from(1)) const nonce = keccak256(toUtf8Bytes('nonce')) const validAfter = 0 const validBefore = MAX_UINT256 - const { r, s, v } = await createTransferWithAuthorizationSignature(from, to, value, validAfter, validBefore, nonce) - + const { r, s, v } = await createTransferWithAuthorizationSignature( + from, + to, + value, + validAfter, + validBefore, + nonce + ) + await expect( token.transferWithAuthorization( - from, to, value, validAfter, validBefore, nonce, v, r, s + from, + to, + value, + validAfter, + validBefore, + nonce, + v, + r, + s ) ).to.be.revertedWith('math: underflow') - }) it('cannot transfer to token', async () => { @@ -527,14 +710,28 @@ describe('GovernToken', async function () { const validAfter = 0 const validBefore = MAX_UINT256 - const { r, s, v } = await createTransferWithAuthorizationSignature(from, token.address, value, validAfter, validBefore, nonce) - + const { r, s, v } = await createTransferWithAuthorizationSignature( + from, + token.address, + value, + validAfter, + validBefore, + nonce + ) + await expect( token.transferWithAuthorization( - from, token.address, value, validAfter, validBefore, nonce, v, r, s + from, + token.address, + value, + validAfter, + validBefore, + nonce, + v, + r, + s ) ).to.be.revertedWith('token: bad to') - }) it('cannot transfer to zero address', async () => { @@ -543,11 +740,26 @@ describe('GovernToken', async function () { const validAfter = 0 const validBefore = MAX_UINT256 - const { r, s, v } = await createTransferWithAuthorizationSignature(from, ZERO_ADDRESS, value, validAfter, validBefore, nonce) - + const { r, s, v } = await createTransferWithAuthorizationSignature( + from, + ZERO_ADDRESS, + value, + validAfter, + validBefore, + nonce + ) + await expect( token.transferWithAuthorization( - from, ZERO_ADDRESS, value, validAfter, validBefore, nonce, v, r, s + from, + ZERO_ADDRESS, + value, + validAfter, + validBefore, + nonce, + v, + r, + s ) ).to.be.revertedWith('token: bad to') }) @@ -558,17 +770,39 @@ describe('GovernToken', async function () { const firstNonce = keccak256(toUtf8Bytes('first')) const firstValue = BigNumber.from(25) - const firstSig = await createTransferWithAuthorizationSignature(from, to, firstValue, validAfter, validBefore, firstNonce) + const firstSig = await createTransferWithAuthorizationSignature( + from, + to, + firstValue, + validAfter, + validBefore, + firstNonce + ) const secondNonce = keccak256(toUtf8Bytes('second')) const secondValue = BigNumber.from(10) - const secondSig = await createTransferWithAuthorizationSignature(from, to, secondValue, validAfter, validBefore, secondNonce) + const secondSig = await createTransferWithAuthorizationSignature( + from, + to, + secondValue, + validAfter, + validBefore, + secondNonce + ) // Use a mismatching signature - + await expect( token.transferWithAuthorization( - from, to, firstValue, validAfter, validBefore, firstNonce, secondSig.v, secondSig.r, secondSig.s + from, + to, + firstValue, + validAfter, + validBefore, + firstNonce, + secondSig.v, + secondSig.r, + secondSig.s ) ).to.be.revertedWith('token: bad sig') }) @@ -578,15 +812,32 @@ describe('GovernToken', async function () { const nonce = keccak256(toUtf8Bytes('nonce')) // Use a future period - const now = BigNumber.from((await ethers.provider.getBlock('latest')).timestamp) + const now = BigNumber.from( + (await ethers.provider.getBlock('latest')).timestamp + ) const validAfter = now.add(BigNumber.from(60)) const validBefore = MAX_UINT256 - const { r, s, v } = await createTransferWithAuthorizationSignature(from, to, value, validAfter, validBefore, nonce) - + const { r, s, v } = await createTransferWithAuthorizationSignature( + from, + to, + value, + validAfter, + validBefore, + nonce + ) + await expect( token.transferWithAuthorization( - from, to, value, validAfter, validBefore, nonce, v, r, s + from, + to, + value, + validAfter, + validBefore, + nonce, + v, + r, + s ) ).to.be.revertedWith('token: auth wait') }) @@ -596,15 +847,32 @@ describe('GovernToken', async function () { const nonce = keccak256(toUtf8Bytes('nonce')) // Use a prior period - const now = BigNumber.from((await ethers.provider.getBlock('latest')).timestamp) + const now = BigNumber.from( + (await ethers.provider.getBlock('latest')).timestamp + ) const validBefore = now.sub(BigNumber.from(60)) const validAfter = 0 - const { r, s, v } = await createTransferWithAuthorizationSignature(from, to, value, validAfter, validBefore, nonce) - + const { r, s, v } = await createTransferWithAuthorizationSignature( + from, + to, + value, + validAfter, + validBefore, + nonce + ) + await expect( token.transferWithAuthorization( - from, to, value, validAfter, validBefore, nonce, v, r, s + from, + to, + value, + validAfter, + validBefore, + nonce, + v, + r, + s ) ).to.be.revertedWith('token: auth expired') }) @@ -616,17 +884,49 @@ describe('GovernToken', async function () { const firstValue = BigNumber.from(25) const secondValue = BigNumber.from(10) - const firstSig = await createTransferWithAuthorizationSignature(from, to, firstValue, validAfter, validBefore, nonce) - const secondSig = await createTransferWithAuthorizationSignature(from, to, secondValue, validAfter, validBefore, nonce) + const firstSig = await createTransferWithAuthorizationSignature( + from, + to, + firstValue, + validAfter, + validBefore, + nonce + ) + const secondSig = await createTransferWithAuthorizationSignature( + from, + to, + secondValue, + validAfter, + validBefore, + nonce + ) // Using one should disallow the other - await token.transferWithAuthorization(from, to, firstValue, validAfter, validBefore, nonce, firstSig.v, firstSig.r, firstSig.s) - + await token.transferWithAuthorization( + from, + to, + firstValue, + validAfter, + validBefore, + nonce, + firstSig.v, + firstSig.r, + firstSig.s + ) + await expect( token.transferWithAuthorization( - from, to, secondValue, validAfter, validBefore, nonce, secondSig.v, secondSig.r, secondSig.s + from, + to, + secondValue, + validAfter, + validBefore, + nonce, + secondSig.v, + secondSig.r, + secondSig.s ) ).to.be.revertedWith('token: auth used') }) }) -}) \ No newline at end of file +}) diff --git a/packages/govern-token/test/helpers/erc2612.js b/packages/govern-token/test/helpers/erc2612.js index cc34a85c2..90ef5e1fa 100644 --- a/packages/govern-token/test/helpers/erc2612.js +++ b/packages/govern-token/test/helpers/erc2612.js @@ -1,28 +1,43 @@ -const { keccak256, defaultAbiCoder, toUtf8Bytes, solidityKeccak256 } = require('ethers/lib/utils') +const { + keccak256, + defaultAbiCoder, + toUtf8Bytes, + solidityKeccak256, +} = require('ethers/lib/utils') -const PERMIT_TYPEHASH = keccak256(toUtf8Bytes('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)')) +const PERMIT_TYPEHASH = keccak256( + toUtf8Bytes( + 'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)' + ) +) -async function createPermitDigest(token, owner, spender, value, nonce, deadline) { +async function createPermitDigest( + token, + owner, + spender, + value, + nonce, + deadline +) { const domainSeparator = await token.getDomainSeparator() return solidityKeccak256( ['bytes1', 'bytes1', 'bytes32', 'bytes32'], [ - '0x19', - '0x01', - domainSeparator, + '0x19', + '0x01', + domainSeparator, keccak256( defaultAbiCoder.encode( ['bytes32', 'address', 'address', 'uint256', 'uint256', 'uint256'], [PERMIT_TYPEHASH, owner, spender, value, nonce, deadline] ) - ) + ), ] - ); - + ) } module.exports = { createPermitDigest, - PERMIT_TYPEHASH + PERMIT_TYPEHASH, } diff --git a/packages/govern-token/test/helpers/erc3009.js b/packages/govern-token/test/helpers/erc3009.js index 1b4f11f19..3ee81858e 100644 --- a/packages/govern-token/test/helpers/erc3009.js +++ b/packages/govern-token/test/helpers/erc3009.js @@ -1,28 +1,60 @@ -const { keccak256, defaultAbiCoder, toUtf8Bytes, solidityKeccak256 } = require('ethers/lib/utils') +const { + keccak256, + defaultAbiCoder, + toUtf8Bytes, + solidityKeccak256, +} = require('ethers/lib/utils') -const TRANSFER_WITH_AUTHORIZATION_TYPEHASH = keccak256(toUtf8Bytes('TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)')) +const TRANSFER_WITH_AUTHORIZATION_TYPEHASH = keccak256( + toUtf8Bytes( + 'TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)' + ) +) -async function createTransferWithAuthorizationDigest(token, from, to, value, validAfter, validBefore, nonce) { +async function createTransferWithAuthorizationDigest( + token, + from, + to, + value, + validAfter, + validBefore, + nonce +) { const domainSeparator = await token.getDomainSeparator() return solidityKeccak256( ['bytes1', 'bytes1', 'bytes32', 'bytes32'], [ - '0x19', - '0x01', - domainSeparator, + '0x19', + '0x01', + domainSeparator, keccak256( defaultAbiCoder.encode( - ['bytes32', 'address', 'address', 'uint256', 'uint256', 'uint256', 'bytes32'], - [TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce] + [ + 'bytes32', + 'address', + 'address', + 'uint256', + 'uint256', + 'uint256', + 'bytes32', + ], + [ + TRANSFER_WITH_AUTHORIZATION_TYPEHASH, + from, + to, + value, + validAfter, + validBefore, + nonce, + ] ) - ) + ), ] - ); - + ) } module.exports = { createTransferWithAuthorizationDigest, - TRANSFER_WITH_AUTHORIZATION_TYPEHASH + TRANSFER_WITH_AUTHORIZATION_TYPEHASH, } diff --git a/packages/govern-token/test/helpers/erc712.js b/packages/govern-token/test/helpers/erc712.js index c0890de75..e2c9f8ecf 100644 --- a/packages/govern-token/test/helpers/erc712.js +++ b/packages/govern-token/test/helpers/erc712.js @@ -1,16 +1,19 @@ -const { keccak256, defaultAbiCoder, toUtf8Bytes} = require('ethers/lib/utils') +const { keccak256, defaultAbiCoder, toUtf8Bytes } = require('ethers/lib/utils') function createDomainSeparator(name, version, chainId, verifyingContract) { - return keccak256( defaultAbiCoder.encode( ['bytes32', 'bytes32', 'bytes32', 'uint256', 'address'], [ - keccak256(toUtf8Bytes('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)')), + keccak256( + toUtf8Bytes( + 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)' + ) + ), keccak256(toUtf8Bytes(name)), keccak256(toUtf8Bytes(version)), chainId, - verifyingContract + verifyingContract, ] ) ) diff --git a/packages/govern-token/test/helpers/merkle-tree/balance-tree.ts b/packages/govern-token/test/helpers/merkle-tree/balance-tree.ts index 0e54d8371..1954fe19f 100644 --- a/packages/govern-token/test/helpers/merkle-tree/balance-tree.ts +++ b/packages/govern-token/test/helpers/merkle-tree/balance-tree.ts @@ -27,9 +27,18 @@ export default class BalanceTree { } // keccak256(abi.encode(index, account, amount)) - public static toNode(index: number | BigNumber, account: string, amount: BigNumber): Buffer { + public static toNode( + index: number | BigNumber, + account: string, + amount: BigNumber + ): Buffer { return Buffer.from( - utils.solidityKeccak256(['uint256', 'address', 'uint256'], [index, account, amount]).substr(2), + utils + .solidityKeccak256( + ['uint256', 'address', 'uint256'], + [index, account, amount] + ) + .substr(2), 'hex' ) } @@ -39,8 +48,11 @@ export default class BalanceTree { } // returns the hex bytes32 values of the proof - public getProof(index: number | BigNumber, account: string, amount: BigNumber): string[] { + public getProof( + index: number | BigNumber, + account: string, + amount: BigNumber + ): string[] { return this.tree.getHexProof(BalanceTree.toNode(index, account, amount)) } } - diff --git a/packages/govern-token/test/helpers/merkle-tree/merkle-tree.ts b/packages/govern-token/test/helpers/merkle-tree/merkle-tree.ts index 658e7bfee..c999129d1 100644 --- a/packages/govern-token/test/helpers/merkle-tree/merkle-tree.ts +++ b/packages/govern-token/test/helpers/merkle-tree/merkle-tree.ts @@ -1,7 +1,6 @@ import { hexlify, arrayify, keccak256 } from 'ethers/lib/utils' export default class MerkleTree { - private readonly elements: Buffer[] private readonly bufferElementPositionIndex: { [hexElement: string]: number } private readonly layers: Buffer[][] @@ -13,7 +12,9 @@ export default class MerkleTree { // Deduplicate elements this.elements = MerkleTree.bufDedup(this.elements) - this.bufferElementPositionIndex = this.elements.reduce<{ [hexElement: string]: number }>((memo, el, index) => { + this.bufferElementPositionIndex = this.elements.reduce<{ + [hexElement: string]: number + }>((memo, el, index) => { memo[hexlify(el)] = index return memo }, {}) @@ -57,7 +58,9 @@ export default class MerkleTree { return first } - return Buffer.from(arrayify(keccak256(MerkleTree.sortAndConcat(first, second)))) + return Buffer.from( + arrayify(keccak256(MerkleTree.sortAndConcat(first, second))) + ) } getRoot(): Buffer { @@ -122,4 +125,3 @@ export default class MerkleTree { return Buffer.concat([...args].sort(Buffer.compare)) } } - diff --git a/packages/govern-token/test/merkle-distributor.js b/packages/govern-token/test/merkle-distributor.js index a6b98e65e..08079596f 100644 --- a/packages/govern-token/test/merkle-distributor.js +++ b/packages/govern-token/test/merkle-distributor.js @@ -1,176 +1,195 @@ const { BigNumber } = require('ethers') -const BalanceTree = require('./helpers/merkle-tree/balance-tree').default; -const { expect } =require('chai'); +const BalanceTree = require('./helpers/merkle-tree/balance-tree').default +const { expect } = require('chai') const ZERO_BYTES32 = `0x${`0`.repeat(64)}` describe('MerkleDistributor', () => { - let wallet0, wallet1 - let TestERC20, Distributor - - before(async () => { - signers = await ethers.getSigners() - wallet0 = await signers[0].getAddress(); // by default, contracts get deployed from the 0th address - wallet1 = await signers[1].getAddress(); - - TestERC20 = await ethers.getContractFactory('TestERC20') - Distributor = await ethers.getContractFactory('MerkleDistributor') - }) - - beforeEach('deploy token', async () => { - token = await TestERC20.deploy('Aragon Network Token', 'ANT', 0) - }) - - describe('#token', () => { - it('returns the token address', async () => { - const distributor = await Distributor.deploy(token.address, ZERO_BYTES32) - expect(await distributor.token()).to.equal(token.address) - }) + let wallet0, wallet1 + let TestERC20, Distributor + + before(async () => { + signers = await ethers.getSigners() + wallet0 = await signers[0].getAddress() // by default, contracts get deployed from the 0th address + wallet1 = await signers[1].getAddress() + + TestERC20 = await ethers.getContractFactory('TestERC20') + Distributor = await ethers.getContractFactory('MerkleDistributor') + }) + + beforeEach('deploy token', async () => { + token = await TestERC20.deploy('Aragon Network Token', 'ANT', 0) + }) + + describe('#token', () => { + it('returns the token address', async () => { + const distributor = await Distributor.deploy(token.address, ZERO_BYTES32) + expect(await distributor.token()).to.equal(token.address) }) + }) - describe('#merkleRoot', () => { - it('returns the zero merkle root', async () => { - const distributor = await Distributor.deploy(token.address, ZERO_BYTES32) - expect(await distributor.merkleRoot()).to.equal(ZERO_BYTES32) - }) + describe('#merkleRoot', () => { + it('returns the zero merkle root', async () => { + const distributor = await Distributor.deploy(token.address, ZERO_BYTES32) + expect(await distributor.merkleRoot()).to.equal(ZERO_BYTES32) }) + }) - describe('two account tree', () => { - let distributor, tree + describe('two account tree', () => { + let distributor, tree - beforeEach('deploy', async () => { - tree = new BalanceTree([ - { account: wallet0, amount: BigNumber.from(100) }, - { account: wallet1, amount: BigNumber.from(101) }, - ]) + beforeEach('deploy', async () => { + tree = new BalanceTree([ + { account: wallet0, amount: BigNumber.from(100) }, + { account: wallet1, amount: BigNumber.from(101) }, + ]) - distributor = await Distributor.deploy(token.address, tree.getHexRoot()) - await token.setBalance(distributor.address, 201) - }) - - it('successful claim', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - const receipt1 = await distributor.claim(0, wallet0, 100, proof0) - await expect(receipt1).to.emit(distributor, 'Claimed').withArgs(0, wallet0, 100); - - const proof1 = tree.getProof(1, wallet1, BigNumber.from(101)) - const receipt2 = await distributor.claim(1, wallet1, 101, proof1) - await expect(receipt2).to.emit(distributor, 'Claimed').withArgs(1, wallet1, 101); - }) + distributor = await Distributor.deploy(token.address, tree.getHexRoot()) + await token.setBalance(distributor.address, 201) + }) - it('transfers the token', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - expect(await token.balanceOf(wallet0)).to.equal(0) + it('successful claim', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + const receipt1 = await distributor.claim(0, wallet0, 100, proof0) + await expect(receipt1) + .to.emit(distributor, 'Claimed') + .withArgs(0, wallet0, 100) + + const proof1 = tree.getProof(1, wallet1, BigNumber.from(101)) + const receipt2 = await distributor.claim(1, wallet1, 101, proof1) + await expect(receipt2) + .to.emit(distributor, 'Claimed') + .withArgs(1, wallet1, 101) + }) - await distributor.claim(0, wallet0, 100, proof0) - expect(await token.balanceOf(wallet0)).to.equal(100) - }) + it('transfers the token', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + expect(await token.balanceOf(wallet0)).to.equal(0) - it('should not fail and should not transfer', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - await token.setBalance(distributor.address, 99) - await distributor.claim(0, wallet0, 100, proof0) - expect(await token.balanceOf(distributor.address)).to.equal(99) - expect(await token.balanceOf(wallet0)).to.equal(0) - }) + await distributor.claim(0, wallet0, 100, proof0) + expect(await token.balanceOf(wallet0)).to.equal(100) + }) - it('sets #isClaimed', async () => { - expect(await distributor.isClaimed(0)).to.equal(false) - expect(await distributor.isClaimed(1)).to.equal(false) + it('should not fail and should not transfer', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + await token.setBalance(distributor.address, 99) + await distributor.claim(0, wallet0, 100, proof0) + expect(await token.balanceOf(distributor.address)).to.equal(99) + expect(await token.balanceOf(wallet0)).to.equal(0) + }) - const proof = tree.getProof(0, wallet0, BigNumber.from(100)) - await distributor.claim(0, wallet0, 100, proof) - expect(await distributor.isClaimed(0)).to.equal(true) - expect(await distributor.isClaimed(1)).to.equal(false) - }) + it('sets #isClaimed', async () => { + expect(await distributor.isClaimed(0)).to.equal(false) + expect(await distributor.isClaimed(1)).to.equal(false) - it('returns unclaimed balance', async () => { - const proof = tree.getProof(0, wallet0, BigNumber.from(100)) - expect(await distributor.unclaimedBalance(0, wallet0, 100, proof)).to.equal(100); - }) + const proof = tree.getProof(0, wallet0, BigNumber.from(100)) + await distributor.claim(0, wallet0, 100, proof) + expect(await distributor.isClaimed(0)).to.equal(true) + expect(await distributor.isClaimed(1)).to.equal(false) + }) - it('returns 0 when it is claimed', async () => { - const proof = tree.getProof(0, wallet0, BigNumber.from(100)) - await distributor.claim(0, wallet0, 100, proof) - expect(await distributor.unclaimedBalance(0, wallet0, 100, proof)).to.equal(0) - }) + it('returns unclaimed balance', async () => { + const proof = tree.getProof(0, wallet0, BigNumber.from(100)) + expect( + await distributor.unclaimedBalance(0, wallet0, 100, proof) + ).to.equal(100) + }) - it('returns 0 for invalid proof', async () => { - expect(await distributor.unclaimedBalance(0, wallet0, 100, [ZERO_BYTES32])).to.equal(0) - }) + it('returns 0 when it is claimed', async () => { + const proof = tree.getProof(0, wallet0, BigNumber.from(100)) + await distributor.claim(0, wallet0, 100, proof) + expect( + await distributor.unclaimedBalance(0, wallet0, 100, proof) + ).to.equal(0) + }) - - it('cannot allow two claims', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - await distributor.claim(0, wallet0, 100, proof0) - await expect(distributor.claim(0, wallet0, 100, proof0)).to.be.revertedWith('dist: already claimed'); - }) + it('returns 0 for invalid proof', async () => { + expect( + await distributor.unclaimedBalance(0, wallet0, 100, [ZERO_BYTES32]) + ).to.equal(0) + }) - it('cannot claim more than once: 0 and then 1', async () => { - const proof1 = tree.getProof(0, wallet0, BigNumber.from(100)) - await distributor.claim(0, wallet0, 100, proof1) - const proof2 = tree.getProof(1, wallet1, BigNumber.from(101)) - await distributor.claim(1, wallet1, 101, proof2) - - await expect(distributor.claim(0, wallet0, 100, proof1)).to.be.revertedWith('dist: already claimed'); - - }) + it('cannot allow two claims', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + await distributor.claim(0, wallet0, 100, proof0) + await expect( + distributor.claim(0, wallet0, 100, proof0) + ).to.be.revertedWith('dist: already claimed') + }) - it('cannot claim more than once: 1 and then 0', async () => { - const proof1 = tree.getProof(1, wallet1, BigNumber.from(101)) - await distributor.claim(1, wallet1, 101, proof1) - const proof2 = tree.getProof(0, wallet0, BigNumber.from(100)) - await distributor.claim(0, wallet0, 100, proof2) - - await expect(distributor.claim(1, wallet1, 101, proof1)).to.be.revertedWith('dist: already claimed'); - }) + it('cannot claim more than once: 0 and then 1', async () => { + const proof1 = tree.getProof(0, wallet0, BigNumber.from(100)) + await distributor.claim(0, wallet0, 100, proof1) + const proof2 = tree.getProof(1, wallet1, BigNumber.from(101)) + await distributor.claim(1, wallet1, 101, proof2) - it('cannot claim for address other than proof', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - await expect(distributor.claim(1, wallet1, 101, proof0)).to.be.revertedWith('dist: proof failed'); - }) + await expect( + distributor.claim(0, wallet0, 100, proof1) + ).to.be.revertedWith('dist: already claimed') + }) - it('cannot claim more than proof', async () => { - const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) - await expect(distributor.claim(0, wallet0, 101, proof0)).to.be.revertedWith('dist: proof failed'); - }) + it('cannot claim more than once: 1 and then 0', async () => { + const proof1 = tree.getProof(1, wallet1, BigNumber.from(101)) + await distributor.claim(1, wallet1, 101, proof1) + const proof2 = tree.getProof(0, wallet0, BigNumber.from(100)) + await distributor.claim(0, wallet0, 100, proof2) + await expect( + distributor.claim(1, wallet1, 101, proof1) + ).to.be.revertedWith('dist: already claimed') }) - describe('larger tree', async () => { + it('cannot claim for address other than proof', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + await expect( + distributor.claim(1, wallet1, 101, proof0) + ).to.be.revertedWith('dist: proof failed') + }) - let distributor, tree - - beforeEach('deploy', async () => { + it('cannot claim more than proof', async () => { + const proof0 = tree.getProof(0, wallet0, BigNumber.from(100)) + await expect( + distributor.claim(0, wallet0, 101, proof0) + ).to.be.revertedWith('dist: proof failed') + }) + }) - const signerAddresses = await Promise.all(signers.map(signer => signer.getAddress())) + describe('larger tree', async () => { + let distributor, tree - tree = new BalanceTree( - signerAddresses.map((address, ix) => { - return { account: address, amount: BigNumber.from(ix + 1) } - }) - ) + beforeEach('deploy', async () => { + const signerAddresses = await Promise.all( + signers.map((signer) => signer.getAddress()) + ) - distributor = await Distributor.deploy(token.address, tree.getHexRoot()) - await token.setBalance(distributor.address, 201) + tree = new BalanceTree( + signerAddresses.map((address, ix) => { + return { account: address, amount: BigNumber.from(ix + 1) } }) - - it('claim index 4', async () => { - const signer = await signers[4].getAddress(); + ) - const proof = tree.getProof(4, signer, BigNumber.from(5)) - const receipt = await distributor.claim(4, signer, 5, proof) - await expect(receipt).to.emit(distributor, 'Claimed').withArgs(4, signer, 5); - }) - - it('claim index 9', async () => { - const signer = await signers[9].getAddress(); - const proof = tree.getProof(9, signer, BigNumber.from(10)) - const receipt = await distributor.claim(9, signer, 10, proof) - await expect(receipt).to.emit(distributor, 'Claimed').withArgs(9, signer, 10); - }) - + distributor = await Distributor.deploy(token.address, tree.getHexRoot()) + await token.setBalance(distributor.address, 201) }) + it('claim index 4', async () => { + const signer = await signers[4].getAddress() + + const proof = tree.getProof(4, signer, BigNumber.from(5)) + const receipt = await distributor.claim(4, signer, 5, proof) + await expect(receipt) + .to.emit(distributor, 'Claimed') + .withArgs(4, signer, 5) + }) + + it('claim index 9', async () => { + const signer = await signers[9].getAddress() + const proof = tree.getProof(9, signer, BigNumber.from(10)) + const receipt = await distributor.claim(9, signer, 10, proof) + await expect(receipt) + .to.emit(distributor, 'Claimed') + .withArgs(9, signer, 10) + }) + }) }) diff --git a/packages/govern/.gitignore b/packages/govern/.gitignore index 2a852ed24..c46bb06af 100644 --- a/packages/govern/.gitignore +++ b/packages/govern/.gitignore @@ -1,3 +1,6 @@ dist/ coverage/ package/ +node_modules/ +cache/ +typechain/ diff --git a/packages/govern/hardhat.config.ts b/packages/govern/hardhat.config.ts new file mode 100644 index 000000000..3b0aff8fa --- /dev/null +++ b/packages/govern/hardhat.config.ts @@ -0,0 +1,49 @@ +import { config as dotenvConfig } from 'dotenv' +import { resolve } from 'path' +dotenvConfig({ path: resolve(__dirname, './.env') }) + +import { HardhatUserConfig } from 'hardhat/types' +import '@nomiclabs/hardhat-ethers' +import '@nomiclabs/hardhat-waffle' +import 'hardhat-deploy' +import 'hardhat-typechain' + +const config: HardhatUserConfig = { + solidity: { + version: '0.6.8', + settings: { + optimizer: { + enabled: true, + runs: 20000, // TODO: target average DAO use + }, + }, + }, + namedAccounts: { + deployer: 0, + }, + paths: { + tests: './tests/hardhat', + }, + defaultNetwork: 'hardhat', + networks: { + hardhat: { + throwOnTransactionFailures: true, + throwOnCallFailures: true, + allowUnlimitedContractSize: true, + blockGasLimit: 0x1fffffffffffff, + // tests that deploy new tokens with proxies set to false, require more than 8,000,000 GAS. + // Without setting this,tests do fail due to out of gas error + gas: 10000000, + forking: { + url: + 'https://eth-rinkeby.alchemyapi.io/v2/E9LWD32GvGvBoNXBcilg7XnjT5riUXjg', + blockNumber: 8441066, + }, + }, + }, + mocha: { + timeout: 30000, + }, +} + +export default config diff --git a/packages/govern/internal/actions/DaoAction.ts b/packages/govern/internal/actions/DaoAction.ts index b798c847c..43edeaae3 100644 --- a/packages/govern/internal/actions/DaoAction.ts +++ b/packages/govern/internal/actions/DaoAction.ts @@ -1,5 +1,6 @@ import AbstractAction from './lib/AbstractAction' -import dao, { Dao } from '../clients/graphql/queries/dao' +import dao from '../clients/graphql/queries/dao' +import { Dao } from '../clients/graphql/fragments/dao-entry' /** * @class DaoAction @@ -28,13 +29,13 @@ export default class DaoAction extends AbstractAction { * * @method execute * - * @returns {Promise} + * @returns {Promise} * * @public */ - public async execute(): Promise { + public async execute(): Promise { const response = await super.execute() - return response.dao; + return response.dao } } diff --git a/packages/govern/internal/actions/DaosAction.ts b/packages/govern/internal/actions/DaosAction.ts index 606cd3463..5a7dbb61f 100644 --- a/packages/govern/internal/actions/DaosAction.ts +++ b/packages/govern/internal/actions/DaosAction.ts @@ -1,5 +1,6 @@ import AbstractAction from './lib/AbstractAction' -import daos, { Daos } from '../clients/graphql/queries/daos' +import daos from '../clients/graphql/queries/daos' +import { Daos } from '../clients/graphql/fragments/dao-entry' /** * @class DaosAction @@ -26,6 +27,6 @@ export default class DaosAction extends AbstractAction { public async execute(): Promise { const response = await super.execute() - return response.daos; + return response.daos } } diff --git a/packages/govern/internal/actions/RegisterToken.ts b/packages/govern/internal/actions/RegisterToken.ts new file mode 100644 index 000000000..72cde3468 --- /dev/null +++ b/packages/govern/internal/actions/RegisterToken.ts @@ -0,0 +1,40 @@ +import { CensusErc20Api } from 'dvote-js' +import { getPool } from './lib/Gateway' +import { ContractReceipt, Wallet, Signer } from 'ethers' + +/** + * + * @param {Wallet | Signer} signer + * @param {string} tokenAddress + * @returns {Promise} + */ +export const isTokenRegistered = async ( + signer: Wallet | Signer, + tokenAddress: string +): Promise => { + const pool = await getPool(signer.provider) + return await CensusErc20Api.isRegistered(tokenAddress, pool) +} + +/** + * + * @param {Wallet | Signer} signer + * @param {string} tokenAddress + * @returns {Promise} + */ +export const registerToken = async ( + signer: Wallet | Signer, + tokenAddress: string +): Promise => { + const pool = await getPool(signer.provider) + const isRegistered = await isTokenRegistered(signer, tokenAddress) + if (isRegistered) { + // already registered, + // we return the string ALREADY_REGISTERED instead of undefined + return 'ALREADY_REGISTERED' + } + + const result = CensusErc20Api.registerTokenAuto(tokenAddress, signer, pool) + + return result +} diff --git a/packages/govern/internal/actions/lib/Gateway.ts b/packages/govern/internal/actions/lib/Gateway.ts new file mode 100644 index 000000000..a838faf46 --- /dev/null +++ b/packages/govern/internal/actions/lib/Gateway.ts @@ -0,0 +1,13 @@ +import { providers } from 'ethers' +import { BRIGE_CONFIG } from '../../configuration/ConfigDefaults' +import { GatewayPool } from 'dvote-js' + +export async function getPool( + provider?: providers.Provider +): Promise { + const network = provider ? await provider.getNetwork() : null + const networkId: string = network?.name || 'rinkeby' + const options = BRIGE_CONFIG[networkId] + const pool = await GatewayPool.discover(options) + return pool +} diff --git a/packages/govern/internal/clients/graphql/GraphQLClient.ts b/packages/govern/internal/clients/graphql/GraphQLClient.ts index 302c674e7..e0eacf449 100644 --- a/packages/govern/internal/clients/graphql/GraphQLClient.ts +++ b/packages/govern/internal/clients/graphql/GraphQLClient.ts @@ -19,11 +19,11 @@ export default class GraphQLClient implements ClientInterface { private client: Client /** - * @param {string} governUrl + * @param {string} subgraphUrl * * @constructor */ - constructor(private governUrl: string) { + constructor(private subgraphUrl: string) { this.connect() } @@ -37,8 +37,8 @@ export default class GraphQLClient implements ClientInterface { private connect(): void { this.client = new Client({ maskTypename: true, - url: this.governUrl, - fetch + url: this.subgraphUrl, + fetch, }) } @@ -57,10 +57,9 @@ export default class GraphQLClient implements ClientInterface { public async request(query: string, args: any = {}): Promise { const result = await this.client.query(gql(query), args).toPromise() - if (result.error) { // TODO: Use errors from core - throw new Error( - this.mapResponse(result) + this.mapError(result.error) - ) + if (result.error) { + // TODO: Use errors from core + throw new Error(this.mapResponse(result) + this.mapError(result.error)) } return result.data @@ -79,7 +78,7 @@ export default class GraphQLClient implements ClientInterface { */ private mapResponse(result: any): string { return ( - `Govern: ${result.operation.context.url}\n\n` + + `Subgraph: ${result.operation.context.url}\n\n` + `Arguments: ${JSON.stringify(result.operation.variables, null, 2)}\n\n` + `Query: ${result.operation.query.loc?.source.body}\n\n` + `Returned data: ${JSON.stringify(result.data, null, 2)}\n\n` diff --git a/packages/govern/internal/clients/graphql/fragments/registry-entry.ts b/packages/govern/internal/clients/graphql/fragments/dao-entry.ts similarity index 56% rename from packages/govern/internal/clients/graphql/fragments/registry-entry.ts rename to packages/govern/internal/clients/graphql/fragments/dao-entry.ts index d0fa81dbb..23c044b21 100644 --- a/packages/govern/internal/clients/graphql/fragments/registry-entry.ts +++ b/packages/govern/internal/clients/graphql/fragments/dao-entry.ts @@ -7,7 +7,7 @@ export type Collateral = { export type ContainerEventChallenge = { id: string createdAt: string - actor: string + challenger: string collateral: Collateral disputeId: string reason: string @@ -38,14 +38,6 @@ export type ContainerEventSchedule = { collateral: Collateral } -export type ContainerEventSubmitEvidence = { - id: string - createdAt: string - evidence: string - submitter: string - finished: boolean -} - export type ContainerEventVeto = { id: string createdAt: string @@ -58,76 +50,135 @@ export type ContainerEvent = | ContainerEventResolve | ContainerEventRule | ContainerEventSchedule - | ContainerEventSubmitEvidence | ContainerEventVeto export interface Action { - id: string, - to: string, - value: string, + id: string + to: string + value: string data: string } -export interface RegistryEntry { - id: string, - name: string, +type Role = { + id: string + entity: string + selector: string + who: string + granted: boolean + frozen: boolean +} + +type Config = { + id: string + executionDelay: string + scheduleDeposit: Collateral + challengeDeposit: Collateral + resolver: string + rules: string +} + +type Executor = { + id: string + address: string + metadata: string + roles: Role[] +} + +type Container = { + id: string + state: string + config: Config + payload: { + id: string + nonce: string + executionTime: string + submitter: string + executor: Executor + actions: Action[] + allowFailuresMap: string + proof: string + } + history: ContainerEvent[] +} + +export interface Dao { + id: string + name: string queue: { - id: string, - address: string, - config: { - executionDelay: string - scheduleDeposit: Collateral, - challengeDeposit: Collateral, - resolver: string, - rules: string - }, - queued: { - id: string, - state: string, - payload: { - id: string, - nonce: string, - executionTime: string, - submitter: string, - actions: Action[] - allowFailuresMap: string, - proof: string - }, - history: ContainerEvent[] - } + id: string + address: string + nonce: string + config: Config + containers: Container[] } + executor: Executor + token: string + registrant: string } -const registryEntry = ` - fragment RegistryEntry_registryEntry on RegistryEntry { +export type Daos = Dao[] + +const daoFragment = ` + fragment daoFragment on Dao { id name queue { id address + nonce config { - executionDelay - scheduleDeposit { + id + executionDelay + scheduleDeposit { + id + token + amount + } + challengeDeposit { + id + token + amount + } + resolver + rules + } + containers { + id + state + config { + id + executionDelay + scheduleDeposit { id token amount - } - challengeDeposit { + } + challengeDeposit { id token amount + } + resolver + rules } - resolver - rules - } - queued { - id - state payload { id nonce executionTime submitter + executor { + id + address + metadata + roles { + id + entity + selector + who + granted + frozen + } + } actions { id to @@ -141,7 +192,7 @@ const registryEntry = ` ... on ContainerEventChallenge { id createdAt - actor + challenger collateral { id token @@ -175,13 +226,6 @@ const registryEntry = ` amount } } - ... on ContainerEventSubmitEvidence { - id - createdAt - evidence - submitter - finished - } ... on ContainerEventVeto { id createdAt @@ -189,8 +233,31 @@ const registryEntry = ` } } } + roles { + id + entity + selector + who + granted + frozen + } + } + executor { + id + address + metadata + roles { + id + entity + selector + who + granted + frozen + } } + token + registrant } ` -export default registryEntry; +export default daoFragment diff --git a/packages/govern/internal/clients/graphql/queries/dao.ts b/packages/govern/internal/clients/graphql/queries/dao.ts index 108091b56..a650ebb6a 100644 --- a/packages/govern/internal/clients/graphql/queries/dao.ts +++ b/packages/govern/internal/clients/graphql/queries/dao.ts @@ -1,24 +1,12 @@ -import registryEntry, { RegistryEntry } from '../fragments/registry-entry' +import daoFragment from '../fragments/dao-entry' -export interface Dao { - id: string, - metadata: string, - address: string, - registryEntries: RegistryEntry[] -} - -const dao: string = ` +const daoQuery: string = ` query DAO($name: String!) { - dao(name: $name) { - id - address - metadata - registryEntries { - ...RegistryEntry_registryEntry - } + dao(id: $name) { + ...daoFragment } } - ${registryEntry} + ${daoFragment} ` -export default dao +export default daoQuery diff --git a/packages/govern/internal/clients/graphql/queries/daos.ts b/packages/govern/internal/clients/graphql/queries/daos.ts index 722e6209f..f530800ba 100644 --- a/packages/govern/internal/clients/graphql/queries/daos.ts +++ b/packages/govern/internal/clients/graphql/queries/daos.ts @@ -1,20 +1,12 @@ -import { Dao } from './dao' -import registryEntry from '../fragments/registry-entry' +import daoFragment from '../fragments/dao-entry' -export type Daos = Dao[] - -const daos: string = ` +const daosQuery: string = ` query DAOS { daos { - id - address - metadata - registryEntries { - ...RegistryEntry_registryEntry - } + ...daoFragment } } - ${registryEntry} + ${daoFragment} ` -export default daos +export default daosQuery diff --git a/packages/govern/internal/clients/lib/ClientInterface.ts b/packages/govern/internal/clients/lib/ClientInterface.ts index e6c221749..582aff4df 100644 --- a/packages/govern/internal/clients/lib/ClientInterface.ts +++ b/packages/govern/internal/clients/lib/ClientInterface.ts @@ -1,4 +1,3 @@ - /** * @interface ClientInterface */ @@ -13,5 +12,5 @@ export default interface ClientInterface { * * @returns {any} */ - request(query: any, args: any): Promise; + request(query: any, args: any): Promise } diff --git a/packages/govern/internal/clients/lib/types/Address.ts b/packages/govern/internal/clients/lib/types/Address.ts index 0679a0c0d..79ea8b124 100644 --- a/packages/govern/internal/clients/lib/types/Address.ts +++ b/packages/govern/internal/clients/lib/types/Address.ts @@ -1 +1 @@ -export type Address = string; +export type Address = string diff --git a/packages/govern/internal/configuration/ConfigDefaults.ts b/packages/govern/internal/configuration/ConfigDefaults.ts new file mode 100644 index 000000000..862e674f2 --- /dev/null +++ b/packages/govern/internal/configuration/ConfigDefaults.ts @@ -0,0 +1,23 @@ +import { IGatewayDiscoveryParameters } from 'dvote-js' + +type BrigeConfig = { + [key: string]: IGatewayDiscoveryParameters +} + +// TODO: update this to mainnet address or ens name, rinkeby address for now +export const DAO_FACTORY_ADDRESS = '0x91209b1352E1aD3abF7C7b74A899F3b118287f9D' //'0xB75290E69F83b52BfbF9C99B4Ae211935E75A851' // +export const GOVERN_REGISTRY_ADDRESS = + '0x93731ce6db7f1ab978c722f3bcda494d12dcc0a1' //'0x7714e0a2a2da090c2bbba9199a54b903bb83a73d' // + +export const BRIGE_CONFIG: BrigeConfig = { + rinkeby: { + networkId: 'rinkeby', + bootnodesContentUri: 'https://bootnodes.vocdoni.net/gateways.dev.json', + environment: 'dev', + }, + mainnet: { + networkId: 'mainnet', + bootnodesContentUri: 'https://bootnodes.vocdoni.net/gateways.json', + environment: 'prod', + }, +} diff --git a/packages/govern/internal/configuration/Configuration.ts b/packages/govern/internal/configuration/Configuration.ts index c1f2f509b..22b6109a4 100644 --- a/packages/govern/internal/configuration/Configuration.ts +++ b/packages/govern/internal/configuration/Configuration.ts @@ -1,12 +1,17 @@ import ClientInterface from '../clients/lib/ClientInterface' import GraphQLClient from '../clients/graphql/GraphQLClient' +import { DAO_FACTORY_ADDRESS, GOVERN_REGISTRY_ADDRESS } from './ConfigDefaults' export interface ConfigurationObject { - governURL?: string + subgraphURL?: string + daoFactoryAddress?: string + tokenStorageProof?: string + governRegistry?: string } let defaultConfig: Configuration -const governURL = 'https://govern.backend.aragon.org' +const subgraphURL = + 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-mainnet' /** * @class Configuration @@ -20,8 +25,10 @@ export default class Configuration { * @private */ private config: { - governURL: string; + subgraphURL: string client: ClientInterface + daoFactoryAddress: string + governRegistry: string } /** @@ -45,27 +52,33 @@ export default class Configuration { * @private */ private setConfig(config: any): void { - if (!config.governURL) { - throw new Error('Missing Govern server URL!') + if (!config.subgraphURL) { + throw new Error('Missing Govern subgraph URL!') + } + + if (!config.daoFactoryAddress) { + throw new Error('Missing Dao factory address!') } this.config = { - governURL: config.governURL, - client: new GraphQLClient(config.governURL) + subgraphURL: config.subgraphURL, + client: new GraphQLClient(config.subgraphURL), + daoFactoryAddress: config.daoFactoryAddress, + governRegistry: config.governRegistry, } } /** - * Getter for governURL + * Getter for subgraphURL * - * @var governURL + * @var subgraphURL * * @returns {string} * * @public */ - get governURL(): string { - return this.config.governURL + get subgraphURL(): string { + return this.config.subgraphURL } /** @@ -81,6 +94,32 @@ export default class Configuration { return this.config.client } + /** + * Getter for daoFactoryAddress property + * + * @var daoFactoryAddress + * + * @returns {string} + * + * @public + */ + get daoFactoryAddress(): string { + return this.config.daoFactoryAddress + } + + /** + * Getter for governRegistry property + * + * @var governRegistry + * + * @returns {string} + * + * @public + */ + get governRegistry(): string { + return this.config.governRegistry + } + /** * Static setter/factory method of the Configuration class * @@ -97,8 +136,16 @@ export default class Configuration { config = {} } - if (!config.governURL) { - config.governURL = governURL + if (!config.subgraphURL) { + config.subgraphURL = subgraphURL + } + + if (!config.daoFactoryAddress) { + config.daoFactoryAddress = DAO_FACTORY_ADDRESS + } + + if (!config.governRegistry) { + config.governRegistry = GOVERN_REGISTRY_ADDRESS } defaultConfig = new Configuration(config) diff --git a/packages/govern/jest.config.e2e.js b/packages/govern/jest.config.e2e.js index 1315a4696..d8bca4647 100644 --- a/packages/govern/jest.config.e2e.js +++ b/packages/govern/jest.config.e2e.js @@ -1,4 +1,4 @@ const jestConfig = require('./jest.config.js') jestConfig.testMatch = ['/**/**Test.e2e.ts'] -module.exports = jestConfig; +module.exports = jestConfig diff --git a/packages/govern/jest.config.js b/packages/govern/jest.config.js index a37f1b0b5..8808cae03 100644 --- a/packages/govern/jest.config.js +++ b/packages/govern/jest.config.js @@ -8,8 +8,8 @@ module.exports = { global: { functions: 80, lines: 80, - statements: 80 - } + statements: 80, + }, }, notify: true, clearMocks: true, @@ -19,6 +19,12 @@ module.exports = { bail: true, coveragePathIgnorePatterns: [ 'node_modules', - 'dist' - ] + 'dist', + 'createDao.ts', + 'proposal.ts', + 'Gateway.ts', + 'token.ts', + 'RegisterToken.ts', + 'public/index.ts', + ], } diff --git a/packages/govern/package.json b/packages/govern/package.json index 922565a2a..97edcc595 100644 --- a/packages/govern/package.json +++ b/packages/govern/package.json @@ -15,8 +15,12 @@ "build:cjs": "tsc -p ./tsconfig.cjs.json", "dev:esm": "yarn build:esm --watch", "dev:cjs": "yarn build:cjs --watch", + "uglify:esm": "uglifyjs dist/esm/public/govern-esm.js --output dist/esm/public/govern-esm.min.js", + "uglify:umd": "uglifyjs dist/umd/public/govern-umd.js --output dist/umd/public/govern-umd.min.js", + "build:contracts": "lerna run --scope=@aragon/govern-core --stream compile", "test": "jest && yarn e2e && yarn depcheck", - "e2e": "./scripts/start.e2e.sh", + "e2e": "yarn build && jest -c ./jest.config.e2e.js", + "test:hardhat": "yarn build:contracts && hardhat test", "depcheck": "yarn build && dependency-check ./package.json --missing --verbose", "prepublishOnly": "yarn build" }, @@ -44,16 +48,23 @@ "devDependencies": { "@ethereumjs/config-tsc": "^1.1.1", "@ethereumjs/config-tslint": "^1.1.1", + "@rollup/plugin-commonjs": "^18.0.0", "@types/jest": "^26.0.15", "coveralls": "^3.1.0", "dependency-check": "^4.1.0", "jest": "^26.6.1", + "rollup": "^2.45.2", + "rollup-plugin-inject-process-env": "^1.3.1", + "rollup-plugin-node-resolve": "^5.2.0", "ts-jest": "^26.4.2", "tslint": "^6.1.3", - "typescript": "^4.0.5" + "typescript": "^4.0.5", + "uglify-es": "^3.3.9" }, "dependencies": { "@urql/core": "^1.13.1", + "dvote-js": "^1.9.14", + "ethers": "^5.4.1", "graphql": "^15.4.0", "graphql-tag": "^2.11.0", "isomorphic-unfetch": "^3.1.0" diff --git a/packages/govern/public/configure.ts b/packages/govern/public/configure.ts index 2c0255916..36d13c21a 100644 --- a/packages/govern/public/configure.ts +++ b/packages/govern/public/configure.ts @@ -1,4 +1,6 @@ -import Configuration, { ConfigurationObject } from '../internal/configuration/Configuration' +import Configuration, { + ConfigurationObject, +} from '../internal/configuration/Configuration' export { ConfigurationObject } from '../internal/configuration/Configuration' diff --git a/packages/govern/public/createDao.ts b/packages/govern/public/createDao.ts new file mode 100644 index 000000000..9518d506a --- /dev/null +++ b/packages/govern/public/createDao.ts @@ -0,0 +1,176 @@ +import { + Contract, + utils, + providers, + Signer, + BigNumberish, + constants, +} from 'ethers' +import Configuration from '../internal/configuration/Configuration' +import { setUpRegisteredEvent } from '../utils/events' + +export const ContainerConfig = ` + tuple( + uint256 executionDelay, + tuple( + address token, + uint256 amount + ) scheduleDeposit, + tuple( + address token, + uint256 amount + ) challengeDeposit, + address resolver, + bytes rules, + uint256 maxCalldataSize + )` + +const token = ` + tuple( + address tokenAddress, + uint8 tokenDecimals, + string tokenName, + string tokenSymbol, + address mintAddress, + uint256 mintAmount, + bytes32 merkleRoot, + uint256 merkleMintAmount, + bytes merkleTree, + bytes merkleContext + )` + +const factoryAbi = [ + `function newGovern( + ${token} _token, + address[] _scheduleAccessList, + bool _useProxies, + ${ContainerConfig} _config, + string _name + ) external`, +] + +const tokenAbi = ['function balanceOf(address who) view returns (uint256)'] + +declare let window: any + +export type Token = { + tokenAddress: string + tokenDecimals: number + tokenName: string + tokenSymbol: string + mintAddress: string + mintAmount: BigNumberish | string + merkleRoot: utils.BytesLike + merkleMintAmount: BigNumberish | string + merkleTree: utils.BytesLike + merkleContext: utils.BytesLike +} + +export type TokenDeposit = { + token: string + amount: BigNumberish | string +} + +export type DaoConfig = { + executionDelay: number | string + scheduleDeposit: TokenDeposit + challengeDeposit: TokenDeposit + resolver: string + rules: utils.BytesLike + maxCalldataSize: number +} + +export type CreateDaoParams = { + name: string + token: Partial + config: DaoConfig + scheduleAccessList: string[] + useProxies?: boolean +} + +export type CreateDaoOptions = { + provider?: any + daoFactoryAddress?: string + governRegistry?: string +} + +/** + * Create a Dao by the given name and token + * + * @param {args} parameters for DAO creation + * + * @param {options} options to overwrite with eip1193 provider and DAO factory address + * + * @param {(tokenAddress: string) => void} registeredDaoTokenCallback + * + * @returns {Promise} transaction response object + */ +export async function createDao( + args: CreateDaoParams, + options: CreateDaoOptions = {}, + registeredDaoCallback?: (tokenAddress: string, executor: string) => void +): Promise { + let token: Partial + + const keys: (keyof Partial)[] = [ + 'tokenName', + 'tokenSymbol', + 'tokenDecimals', + 'mintAddress', + 'merkleRoot', + 'merkleMintAmount', + 'merkleTree', + 'merkleContext', + ] + + if (!args.token.tokenAddress) { + const tokenIsMissingInfo = keys.every((item) => + args.token.hasOwnProperty(item) + ) + if (!tokenIsMissingInfo) { + throw new Error(`Missing ${keys.join(' or ')}`) + } + token = { + tokenAddress: constants.AddressZero, + ...args.token, + } + } else { + token = { + tokenAddress: args.token.tokenAddress, + tokenDecimals: 18, + tokenName: '', + tokenSymbol: '', + mintAddress: constants.AddressZero, + mintAmount: 0, + merkleRoot: '0x' + '00'.repeat(32), + merkleMintAmount: 0, + merkleTree: '0x', + merkleContext: '0x', + } + } + + const config = Configuration.get() + const factoryAddress = options.daoFactoryAddress || config.daoFactoryAddress + const signer = await new providers.Web3Provider( + options.provider || window.ethereum + ).getSigner() + + const contract = new Contract(factoryAddress, factoryAbi, signer) + + setUpRegisteredEvent( + options.governRegistry || config.governRegistry, + signer, + registeredDaoCallback, + args.name + ) + + const result = contract.newGovern( + token, + args.scheduleAccessList, + args.useProxies, + args.config, + args.name + ) + + return result +} diff --git a/packages/govern/public/dao.ts b/packages/govern/public/dao.ts index 7f33f1c1a..df1632fe6 100644 --- a/packages/govern/public/dao.ts +++ b/packages/govern/public/dao.ts @@ -1,4 +1,4 @@ -import { Dao } from '../internal/clients/graphql/queries/dao' +import { Dao } from '../internal/clients/graphql/fragments/dao-entry' import DaoAction from '../internal/actions/DaoAction' export { Dao } @@ -8,8 +8,8 @@ export { Dao } * * @param {string} name * - * @returns {Promise} + * @returns {Promise} */ -export function dao(name: string): Promise { +export function dao(name: string): Promise { return new DaoAction({ name: name }).execute() } diff --git a/packages/govern/public/daos.ts b/packages/govern/public/daos.ts index f5fcce058..3a44f79e4 100644 --- a/packages/govern/public/daos.ts +++ b/packages/govern/public/daos.ts @@ -1,4 +1,4 @@ -import { Daos } from '../internal/clients/graphql/queries/daos' +import { Daos } from '../internal/clients/graphql/fragments/dao-entry' import DaosAction from '../internal/actions/DaosAction' export { Daos } diff --git a/packages/govern/public/index.ts b/packages/govern/public/index.ts index f84c54e7f..0d6f9ed40 100644 --- a/packages/govern/public/index.ts +++ b/packages/govern/public/index.ts @@ -2,10 +2,30 @@ * TODO: Remove index.ts as soon as exports is stable **/ export { configure, ConfigurationObject } from './configure' -export { dao, Dao } from './dao' -export { daos, Daos } from './daos' +export { dao } from './dao' +export { daos } from './daos' export { query } from './query' +export { + createDao, + CreateDaoOptions, + CreateDaoParams, + DaoConfig, + Token, + TokenDeposit, +} from './createDao' +export { + Proposal, + ProposalParams, + ProposalOptions, + ActionType, + PayloadType, + ReceiptType, +} from './proposal' +export { + registerToken, + isTokenRegistered, +} from '../internal/actions/RegisterToken' // Types export { @@ -16,8 +36,8 @@ export { ContainerEventResolve, ContainerEventRule, ContainerEventSchedule, - ContainerEventSubmitEvidence, ContainerEventVeto, - RegistryEntry, - Action -} from '../internal/clients/graphql/fragments/registry-entry' + Dao, + Daos, + Action, +} from '../internal/clients/graphql/fragments/dao-entry' diff --git a/packages/govern/public/proposal.ts b/packages/govern/public/proposal.ts new file mode 100644 index 000000000..712eda9ec --- /dev/null +++ b/packages/govern/public/proposal.ts @@ -0,0 +1,237 @@ +import { DaoConfig, ContainerConfig } from './createDao' +import { + ContractInterface, + Contract, + providers, + BigNumberish, + utils, + ContractTransaction, + ContractReceipt, +} from 'ethers' + +const Payload = ` + tuple( + uint256 nonce, + uint256 executionTime, + address submitter, + address executor, + tuple( + address to, + uint256 value, + bytes data + )[] actions, + bytes32 allowFailuresMap, + bytes proof + ) +` + +export const Container = ` + tuple( + ${Payload} payload, + ${ContainerConfig} config + ) +` +const Collateral = ` + tuple( + address token, + uint256 amount + ) collateral +` + +const queueAbis = [ + `function nonce() view returns (uint256)`, + `function schedule(${Container} _container)`, + `function execute(${Container} _container)`, + `function challenge(${Container} _container, bytes _reason)`, + `function resolve(${Container} _container, uint256 _disputeId)`, + `function veto(${Container} _container, bytes _reason)`, + `function configure(${ContainerConfig} _config)`, + `event Challenged(bytes32 indexed containerHash, address indexed actor, bytes reason, uint256 resolverId, ${Collateral})`, + `event Scheduled(bytes32 indexed containerHash, ${Payload} payload)`, + `event Executed(bytes32 indexed containerHash, address indexed actor)`, + `event Resolved(bytes32 indexed containerHash, address indexed actor, bool approved)`, + `event Vetoed(bytes32 indexed containerHash, address indexed actor, bytes reason)`, + `event Configured(bytes32 indexed configHash, address indexed actor, ${ContainerConfig} config)` +] + +declare let window: any + +export type ProposalOptions = { + provider?: any + abi?: ContractInterface +} + +export type ProposalParams = { + payload: PayloadType + config: DaoConfig +} + +export type PayloadType = { + nonce?: BigNumberish + executionTime: BigNumberish + submitter: string + executor: string + actions: ActionType[] + allowFailuresMap: utils.BytesLike + proof: utils.BytesLike +} + +export type ActionType = { + to: string + value: BigNumberish + data: utils.BytesLike +} + +export enum ReceiptType { + Scheduled = 'Scheduled', + Challenged = 'Challenged', + Executed = 'Executed', + Resolved = 'Resolved', + Vetoed = 'Vetoed' +} + +export class Proposal { + private readonly contract: Contract + private readonly interface: any + + constructor(queueAddress: string, options: ProposalOptions) { + const abi: any = options?.abi || queueAbis // TODO instead of any, put Fragment|JSONFragment from ethers + + const provider = options.provider || window.ethereum + const signer = new providers.Web3Provider(provider).getSigner() + this.contract = new Contract(queueAddress, abi, signer) + this.interface = new utils.Interface(abi) + } + + /** + * Create and schedule a proposal + * + * @param {ProposalParams} proposal for creating and scheduling a DAO proposal + * + * @returns {Promise} transaction response object + */ + async schedule(proposal: ProposalParams): Promise { + const nonce = await this.contract.nonce() + + const proposalWithNonce = Object.assign({}, proposal) + proposalWithNonce.payload.nonce = nonce.add(1) + const result = this.contract.schedule(proposalWithNonce) + return result + } + + /** + * Execute a proposal + * + * @param {ProposalParams} proposal to execute + * + * @returns {Promise} constract response object + */ + async execute(proposal: ProposalParams): Promise { + const result = this.contract.execute(proposal) + return result + } + + /** + * Veto a proposal + * + * @param {ProposalParams} proposal to veto + * + * @param {string} reason + * + * @returns {Promise} constract response object + */ + async veto(proposal: ProposalParams, reason: string): Promise { + const reasonBytes = utils.toUtf8Bytes(reason) + const result = this.contract.veto(proposal, reasonBytes) + return result + } + + /** + * Resolve a proposal + * + * @param {ProposalParams} proposal to resolve + * + * @param {number} disputeId + * + * @returns {Promise} constract response object + */ + async resolve(proposal: ProposalParams, disputeId: number): Promise { + const result = this.contract.resolve(proposal, disputeId) + return result + } + + /** + * Challenge a proposal + * + * @param {ProposalParams} proposal to challenge + * + * @param {string} reason + * + * @returns {Promise} constract response object + */ + async challenge(proposal: ProposalParams, reason: utils.BytesLike): Promise { + // const reasonBytes = utils.toUtf8Bytes(reason) + const result = this.contract.challenge(proposal, reason) + return result + } + + /** + * Build an Action + * + * @param {string} name + * + * @param {any} parameters + * + * @param {number|string} value + * + * @returns {any} + */ + buildAction(name: string, parameters: any, value: number | string): any { + return { + data: this.interface.encodeFunctionData(name, parameters), + to: this.contract.address, + value: value, + } + } + + /** + * @param name function name of the govern queue abi + * + * @returns {string} the signature of the function + */ + getSigHash(name: string): string { + return this.interface.getSighash(name) + } + + /** + * Get the disputeId from a challenge proposal receipt + * + * @param {TransactionReceipt} receipt from the challenged proposal + * + * @returns {number|null>} transaction response object + */ + getDisputeId(receipt: providers.TransactionReceipt): number | null { + const args = receipt.logs + .filter( + ({ address }: { address: string }) => address === this.contract.address + ) + .map((log: any) => this.contract.interface.parseLog(log)) + .find(({ name }: { name: string }) => name === 'Challenged') + + const rawDisputeId = args?.args[3] + const disputeId = rawDisputeId ? rawDisputeId.toNumber() : null + + return disputeId + } + + /** + * Get the container hash from the receipt for the given receipt type + * + * @param {ContractReceipt} receipt from the contract transaction call + * @param {ReceiptType} receiptType the type of receipt, i.e. Scheduled, Challenged, Executed + * @returns {string | undefined} containerHash + */ + static getContainerHashFromReceipt(receipt: ContractReceipt, receiptType: ReceiptType): string | undefined { + return receipt.events?.find(e => e.event === receiptType)?.args?.containerHash + } +} diff --git a/packages/govern/rollup.config.js b/packages/govern/rollup.config.js new file mode 100644 index 000000000..015564b0c --- /dev/null +++ b/packages/govern/rollup.config.js @@ -0,0 +1,44 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import injectProcessEnv from 'rollup-plugin-inject-process-env' + +const esmConfig = { + input: 'dist/esm/public/index.js', + output: { + file: `./dist/esm/public/govern-esm.js`, + format: 'esm', + }, + context: 'window', + plugins: [ + resolve({ + browser: true, + }), + commonjs(), + injectProcessEnv({ + NODE_ENV: 'production', + }), + ], +} + +const umdConfig = { + input: 'dist/cjs/public/index.js', + output: { + file: `./dist/umd/public/govern-umd.js`, + format: 'umd', + name: 'govern', + }, + context: 'window', + plugins: [ + resolve({ + browser: true, + }), + commonjs(), + injectProcessEnv({ + NODE_ENV: 'production', + }), + ], +} + +const configs = [esmConfig, umdConfig] + +export default configs diff --git a/packages/govern/scripts/start.e2e.sh b/packages/govern/scripts/start.e2e.sh deleted file mode 100755 index ccfc4e751..000000000 --- a/packages/govern/scripts/start.e2e.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# Go to govern server package and start dev server -cd ../govern-server/ -nohup yarn dev >>/dev/null 2>>/dev/null & - -# Check if the govern-server is running -yarn server:healthcheck - -# Go to govern package and start e2e tests -cd ../govern -yarn build -jest -c ./jest.config.e2e.js diff --git a/packages/govern/tests/e2e/config.ts b/packages/govern/tests/e2e/config.ts new file mode 100644 index 000000000..b298f1bb1 --- /dev/null +++ b/packages/govern/tests/e2e/config.ts @@ -0,0 +1,2 @@ +export const subgraphURL = + 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-rinkeby-staging' diff --git a/packages/govern/tests/e2e/daoTest.e2e.ts b/packages/govern/tests/e2e/daoTest.e2e.ts index cda84e7b9..5596a257c 100644 --- a/packages/govern/tests/e2e/daoTest.e2e.ts +++ b/packages/govern/tests/e2e/daoTest.e2e.ts @@ -1,40 +1,90 @@ -import { configure, dao } from '@aragon/govern' +import { configure, dao, daos } from '@aragon/govern' +import { subgraphURL } from './config' +import { utils, BigNumber } from 'ethers' /** * dao e2e test */ describe('[e2e] dao Test', () => { beforeEach(() => { - configure({ governURL: 'http://localhost:3000/' }) + configure({ subgraphURL }) }) it('calls dao and returns as expected', async () => { - const response = await dao("M") + const daoList = await daos() - expect(response.id).toEqual('0x24319b199e9e3867ede90eaf0fad56168c54d077') + const daoWithContainer = daoList.find((d) => d.queue.containers.length > 0) - expect(response.address).toEqual('0x24319b199e9e3867ede90eaf0fad56168c54d077') + // fail the test if there is no dao with a container so we can manually + // add a dao for the testing. This should rarely happen because registry + // creation add a dummy doa by default in rinkeby + expect(daoWithContainer).toBeDefined() - expect(response.metadata).toBeDefined() + const { name } = daoWithContainer! - expect(response.registryEntries[0].id).toEqual('M') + expect(name).toBeDefined() - expect(response.registryEntries[0].name).toEqual('M') + const rawResponse = await dao(name) - expect(response.registryEntries[0].queue.id).toEqual('0x498cbf401df68196dc41b4bf53817088cb70b815') + expect(rawResponse).not.toBeNull() - expect(response.registryEntries[0].queue.address).toEqual('0x498cbf401df68196dc41b4bf53817088cb70b815') + const response = rawResponse! - expect(response.registryEntries[0].queue.config.executionDelay).toBeDefined() + expect(response.id).toEqual(name) - expect(response.registryEntries[0].queue.config.scheduleDeposit).toBeDefined() + expect(response.name).toEqual(name) - expect(response.registryEntries[0].queue.config.challengeDeposit).toBeDefined() + expect(response.queue.id).toBeDefined() - expect(response.registryEntries[0].queue.config.resolver).toBeDefined() + expect(utils.isAddress(response.queue.address)).toEqual(true) - expect(response.registryEntries[0].queue.config.rules).toBeDefined() + expect(BigNumber.from(response.queue.nonce).gte(0)).toEqual(true) - expect(Array.isArray(response.registryEntries[0].queue.queued)).toEqual(true) + expect(response.queue.config.executionDelay).toBeDefined() + + expect(response.queue.config.scheduleDeposit).toBeDefined() + + expect(response.queue.config.challengeDeposit).toBeDefined() + + expect(response.queue.config.resolver).toBeDefined() + + expect(response.queue.config.rules).toBeDefined() + + expect(Array.isArray(response.queue.containers)).toEqual(true) + const container = response.queue.containers[0] + expect(container).toBeDefined() + expect(container).toHaveProperty('id') + expect(container).toHaveProperty('state') + expect(container).toHaveProperty('config') + expect(container).toHaveProperty('payload') + expect(utils.isAddress(container.payload.executor.address)).toEqual(true) + expect(utils.isAddress(container.payload.submitter)).toEqual(true) + expect(Array.isArray(container.payload.actions)).toEqual(true) + expect(container.payload.actions[0]).toHaveProperty('id') + expect(utils.isAddress(container.payload.actions[0].to)).toEqual(true) + expect(container.payload.actions[0]).toHaveProperty('value') + expect(container.payload.actions[0]).toHaveProperty('data') + expect(container.payload).toHaveProperty('allowFailuresMap') + expect(container.payload).toHaveProperty('proof') + expect(Array.isArray(container.history)).toEqual(true) + + expect(response.executor.address).toBeDefined() + + expect(utils.isAddress(response.executor.address)).toEqual(true) + + expect(response.executor.metadata).toBeDefined() + + expect(response.executor.roles[0]).toBeDefined() + + expect(utils.isAddress(response.token)).toEqual(true) + expect(utils.isAddress(response.registrant)).toEqual(true) + }) + + it('non-existent dao should return null', async () => { + const name = 'non-existent' + + const response = await dao(name) + + expect(response).toBeNull() }) }) diff --git a/packages/govern/tests/e2e/daosTest.e2e.ts b/packages/govern/tests/e2e/daosTest.e2e.ts index 1437f1ef5..65499b8f4 100644 --- a/packages/govern/tests/e2e/daosTest.e2e.ts +++ b/packages/govern/tests/e2e/daosTest.e2e.ts @@ -1,40 +1,45 @@ import { configure, daos } from '@aragon/govern' +import { subgraphURL } from './config' +import { utils } from 'ethers' /** * daos e2e test */ describe('[e2e] daos Test', () => { beforeEach(() => { - configure({ governURL: 'http://localhost:3000/' }) + configure({ subgraphURL }) }) it('calls daos and returns as expected', async () => { const response = await daos() - expect(response[0].id).toEqual('0x24319b199e9e3867ede90eaf0fad56168c54d077') + expect(Array.isArray(response)).toEqual(true) - expect(response[0].address).toEqual('0x24319b199e9e3867ede90eaf0fad56168c54d077') + expect(response[0].id).toBeDefined() + expect(response[0].id.length).toBeGreaterThan(0) - expect(response[0].metadata).toBeDefined() + expect(response[0].name).toBeDefined() + expect(response[0].name.length).toBeGreaterThan(0) - expect(response[0].registryEntries[0].id).toEqual('M') + expect(response[0].queue.id).toBeDefined() - expect(response[0].registryEntries[0].name).toEqual('M') + expect(utils.isAddress(response[0].queue.address)).toEqual(true) - expect(response[0].registryEntries[0].queue.id).toEqual('0x498cbf401df68196dc41b4bf53817088cb70b815') + expect(response[0].queue.nonce).toBeDefined() - expect(response[0].registryEntries[0].queue.address).toEqual('0x498cbf401df68196dc41b4bf53817088cb70b815') + expect(response[0].queue.config.executionDelay).toBeDefined() - expect(response[0].registryEntries[0].queue.config.executionDelay).toBeDefined() + expect(response[0].queue.config.scheduleDeposit).toBeDefined() - expect(response[0].registryEntries[0].queue.config.scheduleDeposit).toBeDefined() + expect(response[0].queue.config.challengeDeposit).toBeDefined() - expect(response[0].registryEntries[0].queue.config.challengeDeposit).toBeDefined() + expect(response[0].queue.config.resolver).toBeDefined() - expect(response[0].registryEntries[0].queue.config.resolver).toBeDefined() + expect(response[0].queue.config.rules).toBeDefined() - expect(response[0].registryEntries[0].queue.config.rules).toBeDefined() + expect(Array.isArray(response[0].queue.containers)).toEqual(true) - expect(Array.isArray(response[0].registryEntries[0].queue.queued)).toEqual(true) + expect(response[0].executor.metadata).toBeDefined() + expect(utils.isAddress(response[0].executor.address)).toEqual(true) }) }) diff --git a/packages/govern/tests/e2e/queryTest.e2e.ts b/packages/govern/tests/e2e/queryTest.e2e.ts index cb6d98706..100daf3c5 100644 --- a/packages/govern/tests/e2e/queryTest.e2e.ts +++ b/packages/govern/tests/e2e/queryTest.e2e.ts @@ -1,11 +1,13 @@ import { configure, query } from '@aragon/govern' +import { subgraphURL } from './config' +import { utils } from 'ethers' /** * query e2e test */ describe('[e2e] query Test', () => { beforeEach(() => { - configure({ governURL: 'http://localhost:3000/' }) + configure({ subgraphURL }) }) it('calls query and returns as expected', async () => { @@ -13,12 +15,13 @@ describe('[e2e] query Test', () => { query DAOS { daos { id - address - metadata + token + registrant } } `) - expect(response.daos[0].address).toEqual('0x24319b199e9e3867ede90eaf0fad56168c54d077') + expect(utils.isAddress(response.daos[0].token)).toEqual(true) + expect(utils.isAddress(response.daos[0].registrant)).toEqual(true) }) }) diff --git a/packages/govern/tests/hardhat/Gateway.test.ts b/packages/govern/tests/hardhat/Gateway.test.ts new file mode 100644 index 000000000..167415525 --- /dev/null +++ b/packages/govern/tests/hardhat/Gateway.test.ts @@ -0,0 +1,16 @@ +import { getPool } from '../../internal/actions/lib/Gateway' +import { providers } from 'ethers' +import { expect } from 'chai' + +describe('GatewayTest', function () { + it('getPool with provider should work', async function () { + const provider = new providers.InfuraProvider('rinkeby') + const pool = await getPool(provider) + expect(pool).to.have.property('isReady') + }) + + it('getPool without provider should work', async function () { + const pool = await getPool() + expect(pool).to.have.property('isReady') + }) +}) diff --git a/packages/govern/tests/hardhat/createDaoTest.hd.ts b/packages/govern/tests/hardhat/createDaoTest.hd.ts new file mode 100644 index 000000000..f07226728 --- /dev/null +++ b/packages/govern/tests/hardhat/createDaoTest.hd.ts @@ -0,0 +1,264 @@ +import { network, ethers } from 'hardhat' +import { expect } from 'chai' +import { + createDao, + CreateDaoParams, + CreateDaoOptions, +} from '../../public/createDao' + +export const registryAbi = [ + `event Registered(address indexed executor, address queue, address indexed token, address indexed registrant, string name)`, + `event SetMetadata(address indexed executor, bytes metadata)`, + `function nameUsed(string) view returns (bool)`, +] + +// use rinkeby addresses as the tests run on a hardhat network forked from rinkeby +const tokenAddress = '0x9fB402A33761b88D5DcbA55439e6668Ec8D4F2E8' +const registryAddress = '0x93731ce6db7f1ab978c722f3bcda494d12dcc0a1' +const daoFactoryAddress = '0x91209b1352E1aD3abF7C7b74A899F3b118287f9D' + +describe('Create Dao', async function () { + const goodConfig = { + executionDelay: 3600, // how many seconds to wait before being able to call `execute`. + scheduleDeposit: { + token: '0x' + '00'.repeat(20), + amount: 0, + }, + challengeDeposit: { + token: '0x' + '00'.repeat(20), + amount: 0, + }, + resolver: '0x' + '00'.repeat(20), + rules: '0x', + maxCalldataSize: 100000, // initial maxCalldatasize + } + + const [owner, addr1, addr2] = await ethers.getSigners() + const accessList = [owner.address, addr1.address, addr2.address] + + it('Should create a dao successfully', async function () { + const token = { + tokenName: 'magical', + tokenSymbol: 'MAG', + tokenDecimals: 6, + mintAddress: owner.address, + mintAmount: 100, + merkleRoot: '0x' + '00'.repeat(32), + merkleMintAmount: 0, + } + + const params: CreateDaoParams = { + name: 'magic', + token, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const provider = network.provider + const options: CreateDaoOptions = { + provider, + daoFactoryAddress, + } + + const result = await createDao(params, options) + const receipt = await result.wait() + expect(result).to.have.property('hash') + expect(receipt).to.have.property('transactionHash') + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + + // make sure register event is emitted + const registryContract = new ethers.Contract( + registryAddress, + registryAbi, + ethers.provider + ) + + const args = receipt.logs + .filter(({ address }) => address === registryContract.address) + .map((log: any) => registryContract.interface.parseLog(log)) + .find(({ name }: { name: string }) => name === 'Registered') + + const queueAddress = args?.args[1] as string + const governAddress = args?.args[0] as string + const daoName = args?.args[4] as string + + expect(ethers.utils.isAddress(queueAddress)).to.equal(true) + expect(ethers.utils.isAddress(governAddress)).to.equal(true) + expect(daoName).to.equal(params.name) + + // make sure the name is used + const used = await registryContract.nameUsed(params.name) + expect(used).to.equal(true) + }) + + it('Should reject duplicate Dao name', async function () { + const params: CreateDaoParams = { + name: 'sunny', + token: { + tokenName: 'magical', + tokenSymbol: 'MAG', + tokenDecimals: 6, + }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const provider = network.provider + const options: CreateDaoOptions = { + provider, + daoFactoryAddress, + } + + const result = await createDao(params, options) + await result.wait() + + await expect(createDao(params, options)).to.be.reverted + }) + + it('Should throw if token address and token symbol are missing', async function () { + const params: CreateDaoParams = { + name: 'moon', + token: { tokenName: 'moon' }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const provider = network.provider + const options: CreateDaoOptions = { + provider, + daoFactoryAddress, + } + + try { + const result = await createDao(params, options) + expect(result).to.be.undefined + } catch (err) { + expect(err).to.have.property('message') + } + }) + + it('Should throw if token address and token name are missing', async function () { + const params: CreateDaoParams = { + name: 'moon2', + token: { tokenSymbol: 'moon' }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const provider = network.provider + const options: CreateDaoOptions = { + provider, + daoFactoryAddress, + } + + try { + const result = await createDao(params, options) + expect(result).to.be.undefined + } catch (err) { + expect(err).to.have.property('message') + } + }) + + it('Should create a dao successfully if only token address is given', async function () { + const params: CreateDaoParams = { + name: 'awesome', + token: { tokenAddress, tokenDecimals: 6 }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const provider = network.provider + const options: CreateDaoOptions = { + provider, + daoFactoryAddress, + } + + const result = await createDao(params, options) + expect(result).to.have.property('hash') + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + }) + + it('Should throw if provider is not provided and window.ethereum is not available', async function () { + const params: CreateDaoParams = { + name: 'spring', + token: { tokenName: 'spring' }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const options: CreateDaoOptions = { + daoFactoryAddress, + } + + try { + const result = await createDao(params, options) + expect(result).to.be.undefined + } catch (err) { + expect(err).to.have.property('message') + } + }) + + it('Should throw if token address is zero and name is missing', async function () { + const params: CreateDaoParams = { + name: 'summer', + config: goodConfig, + token: { tokenAddress: ethers.constants.AddressZero }, + scheduleAccessList: accessList, + } + + const options: CreateDaoOptions = { + provider: network.provider, + daoFactoryAddress, + } + + try { + const result = await createDao(params, options) + expect(result).to.be.undefined + } catch (err) { + expect(err).to.have.property('message') + } + }) + + it('Should create a dao successfully if useProxies is true', async function () { + const params: CreateDaoParams = { + name: 'rainbow', + token: { tokenAddress }, + config: goodConfig, + scheduleAccessList: accessList, + useProxies: true, + } + + const options: CreateDaoOptions = { + provider: network.provider, + daoFactoryAddress, + } + + const result = await createDao(params, options) + expect(result).to.have.property('hash') + }) + + it('Should create a dao successfully if useProxies is missing', async function () { + const params: CreateDaoParams = { + name: 'bridge', + token: { tokenAddress }, + config: goodConfig, + scheduleAccessList: accessList, + } + + const options: CreateDaoOptions = { + provider: network.provider, + daoFactoryAddress, + } + + const result = await createDao(params, options) + expect(result).to.have.property('hash') + }) +}) diff --git a/packages/govern/tests/hardhat/proposal.test.ts b/packages/govern/tests/hardhat/proposal.test.ts new file mode 100644 index 000000000..a09e64394 --- /dev/null +++ b/packages/govern/tests/hardhat/proposal.test.ts @@ -0,0 +1,384 @@ +import { ethers, network } from 'hardhat' +import { expect } from 'chai' +import { createDao, CreateDaoParams, DaoConfig } from '../../public/createDao' +import { registryAbi } from './createDaoTest.hd' +import { + Proposal, + ProposalParams, + PayloadType, + ProposalOptions, + ActionType, + Token, +} from '../../public' + +import { Container, ReceiptType } from '../../public/proposal' +import { TestToken, ArbitratorMock } from '@aragon/govern-core/typechain' + +import * as TestTokenArtifact from '@aragon/govern-core/artifacts/contracts/test/TestToken.sol/TestToken.json' +import * as ArbitratorMockArtifact from '@aragon/govern-core/artifacts/contracts/test/ArbitratorMock.sol/ArbitratorMock.json' +import { TransactionReceipt } from '@ethersproject/abstract-provider' + +const RULES = { + APPROVED: 4, + DENIED: 3, +} + +const vetoAbi = [ + 'function bulk((uint8 op, bytes4 role, address who)[] items)', + `function veto(${Container} _container, bytes _reason)`, +] + +// use rinkeby addresses as the tests run on a hardhat network forked from rinkeby +const tokenAddress = '0x9fB402A33761b88D5DcbA55439e6668Ec8D4F2E8' +const registryAddress = '0xb24e94DfDa0A836340b6cA4BFcfe7221327ccE81' +const daoFactoryAddress = '0xeD98d35b6C2887c8e9B410a9561BBd7f8d6BbD16' +const emptyBytes = '0x' + +const noCollateral = { + token: ethers.constants.AddressZero, + amount: 0, +} + +type payloadArgs = { + submitter: string + executor: string + executionTime: number + actions?: ActionType[] +} + +// advance the time in blockchain so we can run test faster +async function advanceTime(provider: any) { + const currentTimestamp = (await provider.getBlock('latest')).timestamp + await provider.send('evm_increaseTime', [currentTimestamp + 100]) +} + +function encodeDataForVetoRole(who: string): string { + const iface = new ethers.utils.Interface(vetoAbi) + const role = iface.getSighash('veto') + const paramData = iface.encodeFunctionData('bulk', [[{ op: 0, role, who }]]) + return paramData +} + +const buildPayload = ({ + submitter, + executor, + actions, + executionTime, +}: payloadArgs) => { + const payload: PayloadType = { + executionTime, + submitter, + executor, + actions: actions ?? [{ to: tokenAddress, value: 0, data: emptyBytes }], + allowFailuresMap: ethers.utils.hexZeroPad('0x0', 32), + proof: emptyBytes, + } + + return payload +} + +type ProposalResult = { + proposal: Proposal + proposalData: ProposalParams + txResult: any +} + +type makeProposalParams = { + options: ProposalOptions + queueAddress: string + executor: string + actions?: ActionType[] +} + +describe('Proposal', function () { + let queueAddress: string + let executor: string + let testToken: TestToken + let signer = new ethers.providers.Web3Provider( + network.provider + ).getSigner() + let arbitrator: ArbitratorMock + const daoConfig: DaoConfig = { + executionDelay: 1, // how many seconds to wait before being able to call `execute`. + scheduleDeposit: noCollateral, + challengeDeposit: noCollateral, + resolver: '', + rules: emptyBytes, + maxCalldataSize: 100000, // initial maxCalldatasize + } + + const createArbitratorMock = async (testTokenAddress: string) => { + const { abi, bytecode } = ArbitratorMockArtifact + const ArbitratorMock = new ethers.ContractFactory(abi, bytecode, signer) + const arbitratorMock = (await ArbitratorMock.deploy( + testTokenAddress + )) as ArbitratorMock + return arbitratorMock + } + + const createTestToken = async () => { + const { abi, bytecode } = TestTokenArtifact + const signerAddress = await signer.getAddress() + const TestToken = new ethers.ContractFactory(abi, bytecode, signer) + const testToken = (await TestToken.deploy(signerAddress)) as TestToken + await testToken.mint(signerAddress, 1000000) + return testToken + } + + async function makeProposal( + args: makeProposalParams + ): Promise { + const { options, queueAddress, executor, actions } = args + const proposal = new Proposal(queueAddress, options) + const web3Provider = new ethers.providers.Web3Provider(options.provider) + const submitter = await web3Provider.getSigner().getAddress() + + const currentTimestamp = (await web3Provider.getBlock('latest')).timestamp + const executionTime = + Number(currentTimestamp) + Number(daoConfig.executionDelay) + 100 + const payload = buildPayload({ + submitter, + executor, + actions, + executionTime, + }) + const proposalData = { payload, config: daoConfig } + const txResult = await proposal.schedule(proposalData) + + return { proposal, proposalData, txResult } + } + + async function grantVetoPower( + provider: any, + queueAddress: string, + executor: string + ) { + const signer = new ethers.providers.Web3Provider(provider).getSigner() + const testUser = await signer.getAddress() + + const changeVetoRole = encodeDataForVetoRole(testUser) + const actions: ActionType[] = [ + { to: queueAddress, value: 0, data: changeVetoRole }, + ] + + const { + proposal: vetoProposal, + txResult: vetoProposalTx, + proposalData: vetoData, + } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + actions, + }) + await vetoProposalTx.wait() + + // advance the time so we can execute the proposal immediately + await advanceTime(ethers.provider) + + const vetoResult = await vetoProposal.execute(vetoData) + const execResult = await vetoResult.wait() + + expect(execResult.status).to.equal(1) + expect(vetoResult.hash).to.equal(execResult.transactionHash) + } + + before(async () => { + // create dao + testToken = await createTestToken() + arbitrator = await createArbitratorMock(testToken.address) + daoConfig.resolver = arbitrator.address + + const [owner, addr1, addr2] = await ethers.getSigners() + const accessList = [owner.address, addr1.address, addr2.address] + + const token: Partial = { + tokenName: 'unicorn', + tokenSymbol: 'MAG', + tokenDecimals: 6, + mintAddress: owner.address, + mintAmount: 100, + merkleRoot: '0x' + '00'.repeat(32), + merkleMintAmount: 0, + merkleTree: '0x', + merkleContext: '0x', + } + + const params: CreateDaoParams = { + name: 'unicorn', + token, + config: daoConfig, + scheduleAccessList: accessList, + useProxies: false, + } + + const options = { + provider: network.provider, + daoFactoryAddress, + governRegistry: registryAddress, + } + const result = await createDao(params, options) + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + + // get executor and queue address from register event + const iface = new ethers.utils.Interface(registryAbi) + const args = receipt.logs + .filter(({ address }) => address === registryAddress) + .map((log: any) => iface.parseLog(log)) + .find(({ name }: { name: string }) => name === 'Registered') + + executor = args?.args[0] as string + queueAddress = args?.args[1] as string + + expect(executor).to.be.a('string').with.length.greaterThan(0) + expect(queueAddress).to.be.a('string').with.length.greaterThan(0) + }) + + it('schedule should work', async function () { + const { txResult } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + }) + + const receipt = await txResult.wait() + expect(receipt.status).to.equal(1) + expect(txResult.hash).to.equal(receipt.transactionHash) + const containerHash = Proposal.getContainerHashFromReceipt( + receipt, + ReceiptType.Scheduled + ) + expect(containerHash).to.be.a('string').with.length.greaterThan(0) + }) + + it('veto should work', async function () { + // remember the snapshot to move back after this test is finished. + const snapshotId = await ethers.provider.send('evm_snapshot', []) + // submit a proposal to give the test user veto power + await grantVetoPower(network.provider, queueAddress, executor) + + const { proposal, txResult, proposalData } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + }) + await txResult.wait() + + const reason = 'veto reason' + const result = await proposal.veto(proposalData, reason) + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + const containerHash = Proposal.getContainerHashFromReceipt( + receipt, + ReceiptType.Vetoed + ) + expect(containerHash).to.be.a('string').with.length.greaterThan(0) + + // gets back to the snapshot before time was advanced. + // necessary so that other tests can still work with court + // without getting CLK_TOO_MANY_TRANSITIONS error. + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('challenge should work', async function () { + const { feeAmount } = await arbitrator.getDisputeFees() + let tx = await testToken.approve(queueAddress, feeAmount) + await tx.wait() + + const { proposal, txResult, proposalData } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + }) + await txResult.wait() + + const reason = ethers.utils.toUtf8Bytes('challenge reason') + const result = await proposal.challenge(proposalData, reason) + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + const containerHash = Proposal.getContainerHashFromReceipt( + receipt, + ReceiptType.Challenged + ) + expect(containerHash).to.be.a('string').with.length.greaterThan(0) + }) + + it('resolve should work', async function () { + const { feeAmount } = await arbitrator.getDisputeFees() + let tx = await testToken.approve(queueAddress, feeAmount) + await tx.wait() + + const { proposal, txResult, proposalData } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + }) + await txResult.wait() + + const reason = ethers.utils.toUtf8Bytes('challenge reason') + tx = await proposal.challenge(proposalData, reason) + const challengeReceipt = await tx.wait() + + // can only dispute after a challenge + const disputeId = proposal.getDisputeId( + challengeReceipt + ) + expect(disputeId).to.not.be.null + + await arbitrator.executeRuling(disputeId!, RULES.APPROVED) + const result = await proposal.resolve(proposalData, disputeId!) + + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + const containerHash = Proposal.getContainerHashFromReceipt( + receipt, + ReceiptType.Resolved + ) + expect(containerHash).to.be.a('string').with.length.greaterThan(0) + }) + + it('execute should work', async function () { + const { proposal, proposalData, txResult } = await makeProposal({ + options: { provider: network.provider }, + queueAddress, + executor, + }) + await txResult.wait() + + // advance the time so we can execute the proposal immediately + await advanceTime(ethers.provider) + const result = await proposal.execute(proposalData) + const receipt = await result.wait() + expect(receipt.status).to.equal(1) + expect(result.hash).to.equal(receipt.transactionHash) + const containerHash = Proposal.getContainerHashFromReceipt( + receipt, + ReceiptType.Executed + ) + expect(containerHash).to.be.a('string').with.length.greaterThan(0) + }) + + it('use invalid queue abi should throw', async function () { + const abi = [ + `function schedule(bool) public`, + `function nonce() public view returns (uint256)`, + ] + + try { + const provider = network.provider + const tx = await makeProposal({ + options: { provider, abi }, + queueAddress, + executor, + }) + expect(tx).to.be.undefined + } catch (err) { + expect(err.message).to.eq('Transaction reverted without a reason') + } + }) +}) diff --git a/packages/govern/tests/internal/actions/DaoActionTest.ts b/packages/govern/tests/internal/actions/DaoActionTest.ts index e4abdc0b6..b314c80db 100644 --- a/packages/govern/tests/internal/actions/DaoActionTest.ts +++ b/packages/govern/tests/internal/actions/DaoActionTest.ts @@ -13,7 +13,6 @@ describe('DaoActionTest', () => { clientMockClass = GraphQLClient as jest.MockedClass, clientMock: GraphQLClient - beforeEach(() => { action = new DaoAction({ name: 'myName' }) clientMock = clientMockClass.mock.instances[0] @@ -21,14 +20,14 @@ describe('DaoActionTest', () => { it('calls execute and does map the response accordingly', async () => { clientMock.request = jest.fn((query: string, args: any = {}) => { - expect(query).toEqual(dao); + expect(query).toEqual(dao) - expect(args).toEqual({name: 'myName'}) + expect(args).toEqual({ name: 'myName' }) - return Promise.resolve({dao: true}) - }); + return Promise.resolve({ dao: true }) + }) - const response = await action.execute(); + const response = await action.execute() expect(response).toEqual(true) }) diff --git a/packages/govern/tests/internal/actions/DaosActionTest.ts b/packages/govern/tests/internal/actions/DaosActionTest.ts index b7fde3a9b..6c5c471ec 100644 --- a/packages/govern/tests/internal/actions/DaosActionTest.ts +++ b/packages/govern/tests/internal/actions/DaosActionTest.ts @@ -13,7 +13,6 @@ describe('DaoActionTest', () => { clientMockClass = GraphQLClient as jest.MockedClass, clientMock: GraphQLClient - beforeEach(() => { action = new DaosAction() clientMock = clientMockClass.mock.instances[0] @@ -21,14 +20,14 @@ describe('DaoActionTest', () => { it('calls execute and does map the response accordingly', async () => { clientMock.request = jest.fn((query: string, args: any = {}) => { - expect(query).toEqual(daos); + expect(query).toEqual(daos) expect(args).toEqual({}) - return Promise.resolve({daos: true}) - }); + return Promise.resolve({ daos: true }) + }) - const response = await action.execute(); + const response = await action.execute() expect(response).toEqual(true) }) diff --git a/packages/govern/tests/internal/actions/lib/AbstractActionTest.ts b/packages/govern/tests/internal/actions/lib/AbstractActionTest.ts index 0a1aade37..6c79cac39 100644 --- a/packages/govern/tests/internal/actions/lib/AbstractActionTest.ts +++ b/packages/govern/tests/internal/actions/lib/AbstractActionTest.ts @@ -30,7 +30,6 @@ describe('AbstractActionTest', () => { return Promise.resolve(true) }) - await expect(abstractAction.execute()).resolves.toEqual(true) expect(clientInstance.request).toHaveBeenCalledTimes(1) diff --git a/packages/govern/tests/internal/clients/GraphQLClientTest.ts b/packages/govern/tests/internal/clients/GraphQLClientTest.ts index 6234a981c..58dcc90d3 100644 --- a/packages/govern/tests/internal/clients/GraphQLClientTest.ts +++ b/packages/govern/tests/internal/clients/GraphQLClientTest.ts @@ -26,7 +26,7 @@ describe('GraphQLClientTest', () => { expect(Client).toHaveBeenNthCalledWith(1, { maskTypename: true, url: 'localhost', - fetch + fetch, }) }) @@ -34,7 +34,7 @@ describe('GraphQLClientTest', () => { const nestedToPromise = { toPromise: jest.fn(async () => { return { error: false, data: true } - }) + }), } urqlClientMock.query = jest.fn((query, args) => { @@ -60,24 +60,24 @@ describe('GraphQLClientTest', () => { return { error: { name: 'ERROR', - message: 'MESSAGE' + message: 'MESSAGE', }, data: 'data', operation: { context: { - url: 'localhost' + url: 'localhost', }, variables: 'variables', query: { loc: { source: { - body: 'body' - } - } - } - } + body: 'body', + }, + }, + }, + }, } - }) + }), } urqlClientMock.query = jest.fn((query, args) => { @@ -88,17 +88,19 @@ describe('GraphQLClientTest', () => { return nestedToPromise }) - await expect(client.request(testQuery, { test: 'test' })).rejects.toEqual(new Error( - 'Govern: localhost\n' + - '\n' + - 'Arguments: "variables"\n' + - '\n' + - 'Query: body\n' + - '\n' + - 'Returned data: "data"\n' + - '\n' + - 'ERROR: MESSAGE\n\n' - )) + await expect(client.request(testQuery, { test: 'test' })).rejects.toEqual( + new Error( + 'Subgraph: localhost\n' + + '\n' + + 'Arguments: "variables"\n' + + '\n' + + 'Query: body\n' + + '\n' + + 'Returned data: "data"\n' + + '\n' + + 'ERROR: MESSAGE\n\n' + ) + ) expect(urqlClientMock.query).toHaveBeenCalledTimes(1) diff --git a/packages/govern/tests/internal/configuration/ConfigurationTest.ts b/packages/govern/tests/internal/configuration/ConfigurationTest.ts index 4fffd1f23..1b6260f7d 100644 --- a/packages/govern/tests/internal/configuration/ConfigurationTest.ts +++ b/packages/govern/tests/internal/configuration/ConfigurationTest.ts @@ -1,9 +1,15 @@ import GraphQLClient from '../../../internal/clients/graphql/GraphQLClient' import Configuration from '../../../internal/configuration/Configuration' +import { DAO_FACTORY_ADDRESS } from '../../../internal/configuration/ConfigDefaults' // Mocks jest.mock('../../../internal/clients/graphql/GraphQLClient') +const expected = { + defaultUrl: + 'https://api.thegraph.com/subgraphs/name/aragon/aragon-govern-mainnet', +} + /** * Configuration test */ @@ -11,40 +17,55 @@ describe('ConfigurationTest', () => { let config: Configuration beforeEach(() => { - config = new Configuration({ governURL: 'localhost' }) + config = new Configuration({ + subgraphURL: 'localhost', + daoFactoryAddress: '0x123', + }) }) it('initialization test', () => { - expect(config.governURL).toEqual('localhost') + expect(config.subgraphURL).toEqual('localhost') expect(config.client).toBeInstanceOf(GraphQLClient) + + expect(config.daoFactoryAddress).toEqual('0x123') }) it('initialization failed test', () => { expect(() => { - new Configuration({ governURL: null }) - }).toThrow('Missing Govern server URL!') + new Configuration({ subgraphURL: null }) + }).toThrow('Missing Govern subgraph URL!') + }) + + it('initialization factory address to null failed test', () => { + expect(() => { + new Configuration({ subgraphURL: 'localhost', daoFactoryAddress: null }) + }).toThrow('Missing Dao factory address!') }) it('calls Configuration.get and returns the expected default config', () => { const config = Configuration.get() - expect(config.governURL).toEqual('https://govern.backend.aragon.org') + expect(config.subgraphURL).toEqual(expected.defaultUrl) expect(config.client).toBeInstanceOf(GraphQLClient) + expect(config.daoFactoryAddress).toEqual(DAO_FACTORY_ADDRESS) + expect(config).toBeInstanceOf(Configuration) }) - it('calls Configuration.set without the governURL and defines the default aragon govern URL as expected', () => { + it('calls Configuration.set without the subgraphURL and receives the default subgraph URL as expected', () => { Configuration.set({}) const config = Configuration.get() - expect(config.governURL).toEqual('https://govern.backend.aragon.org') + expect(config.subgraphURL).toEqual(expected.defaultUrl) expect(config.client).toBeInstanceOf(GraphQLClient) + expect(config.daoFactoryAddress).toEqual(DAO_FACTORY_ADDRESS) + expect(config).toBeInstanceOf(Configuration) }) }) diff --git a/packages/govern/tests/public/configurationTest.ts b/packages/govern/tests/public/configurationTest.ts index f133bb371..0c131d152 100644 --- a/packages/govern/tests/public/configurationTest.ts +++ b/packages/govern/tests/public/configurationTest.ts @@ -10,14 +10,19 @@ jest.mock('../../internal/clients/graphql/GraphQLClient') */ describe('configure Test', () => { it('calls configure and defines the expected default config', () => { - configure({ governURL: 'localhost' } as ConfigurationObject) + configure({ + subgraphURL: 'localhost', + daoFactoryAddress: '0x123', + } as ConfigurationObject) const config = Configuration.get() - expect(config.governURL).toEqual('localhost') + expect(config.subgraphURL).toEqual('localhost') expect(config.client).toBeInstanceOf(GraphQLClient) + expect(config.daoFactoryAddress).toEqual('0x123') + expect(config).toBeInstanceOf(Configuration) }) }) diff --git a/packages/govern/tests/public/daoTest.ts b/packages/govern/tests/public/daoTest.ts index 226fbd87e..cf7dfa131 100644 --- a/packages/govern/tests/public/daoTest.ts +++ b/packages/govern/tests/public/daoTest.ts @@ -1,5 +1,5 @@ import DaoAction from '../../internal/actions/DaoAction' -import { dao} from '../../public/dao' +import { dao } from '../../public/dao' // Mocks jest.mock('../../internal/actions/DaoAction') diff --git a/packages/govern/tests/public/daosTest.ts b/packages/govern/tests/public/daosTest.ts index 4d7833dba..928636aac 100644 --- a/packages/govern/tests/public/daosTest.ts +++ b/packages/govern/tests/public/daosTest.ts @@ -1,5 +1,5 @@ import DaosAction from '../../internal/actions/DaosAction' -import { daos} from '../../public/daos' +import { daos } from '../../public/daos' // Mocks jest.mock('../../internal/actions/DaosAction') diff --git a/packages/govern/tests/public/queryTest.ts b/packages/govern/tests/public/queryTest.ts index f7c0f1494..f35beffef 100644 --- a/packages/govern/tests/public/queryTest.ts +++ b/packages/govern/tests/public/queryTest.ts @@ -1,6 +1,6 @@ import { query } from '../../public' import Configuration from '../../internal/configuration/Configuration' -import GraphQLClient from '../../internal/clients/graphql/GraphQLClient'; +import GraphQLClient from '../../internal/clients/graphql/GraphQLClient' // Mocks jest.mock('../../internal/clients/graphql/GraphQLClient') @@ -9,13 +9,22 @@ jest.mock('../../internal/clients/graphql/GraphQLClient') * query test */ describe('query Test', () => { - const graphQLClientMock = GraphQLClient as jest.MockedClass + const graphQLClientMock = GraphQLClient as jest.MockedClass< + typeof GraphQLClient + > it('calls query and executes as expected', async () => { await query('quest Test { name }') - expect(GraphQLClient).toHaveBeenNthCalledWith(1, Configuration.get().governURL) + expect(GraphQLClient).toHaveBeenNthCalledWith( + 1, + Configuration.get().subgraphURL + ) - expect(graphQLClientMock.mock.instances[0].request).toHaveBeenNthCalledWith(1, 'quest Test { name }', {}) + expect(graphQLClientMock.mock.instances[0].request).toHaveBeenNthCalledWith( + 1, + 'quest Test { name }', + {} + ) }) }) diff --git a/packages/govern/tsconfig.cjs.json b/packages/govern/tsconfig.cjs.json index 657c4d647..9f14eec6c 100644 --- a/packages/govern/tsconfig.cjs.json +++ b/packages/govern/tsconfig.cjs.json @@ -5,16 +5,10 @@ "strictPropertyInitialization": false, "sourceRoot": "./", "outDir": "./dist/cjs", + "strict": false, "inlineSources": true, - "types": [ - "jest" - ], - "lib": [ - "dom" - ] + "types": ["jest"], + "lib": ["dom"] }, - "include": [ - "./internal/**/*", - "./public/**/*" - ] + "include": ["./internal/**/*", "./public/**/*"] } diff --git a/packages/govern/tsconfig.esm.json b/packages/govern/tsconfig.esm.json index be19ad75b..d79fa9a36 100644 --- a/packages/govern/tsconfig.esm.json +++ b/packages/govern/tsconfig.esm.json @@ -5,18 +5,13 @@ "target": "es2018", "removeComments": true, "strictPropertyInitialization": false, + "strict": false, "outDir": "./dist/esm", + "strict": false, "sourceRoot": "./", "inlineSources": true, - "types": [ - "jest" - ], - "lib": [ - "dom" - ] + "types": ["jest"], + "lib": ["dom"] }, - "include": [ - "./internal/**/*", - "./public/**/*" - ] + "include": ["./internal/**/*", "./public/**/*"] } diff --git a/packages/govern/tsconfig.json b/packages/govern/tsconfig.json index f7e9a54b5..74da17269 100644 --- a/packages/govern/tsconfig.json +++ b/packages/govern/tsconfig.json @@ -5,16 +5,10 @@ "strictPropertyInitialization": false, "outDir": "./dist", "inlineSources": true, - "types": [ - "jest" - ], - "lib": [ - "dom", - "es2018" - ] + "strict": false, + "resolveJsonModule": true, + "types": ["jest"], + "lib": ["dom", "es2018"] }, - "include": [ - "./internal/**/*", - "./public/**/*" - ] + "include": ["./internal/**/*", "./public/**/*"] } diff --git a/packages/govern/utils/events.ts b/packages/govern/utils/events.ts new file mode 100644 index 000000000..4d8fe4200 --- /dev/null +++ b/packages/govern/utils/events.ts @@ -0,0 +1,40 @@ +import { Contract, providers, Signer } from 'ethers' + +const registryAbi = [ + `event Registered( + address indexed executor, + address queue, + address indexed token, + address minter, + address indexed registrant, + string name + )`, +] + +let governRegistryInstance = null + +export function setUpRegisteredEvent( + registryAddress: string, + signer: providers.Provider | Signer, + fn: Function, + daoName: string +) { + if (governRegistryInstance) { + governRegistryInstance.removeAllListeners('Registered'); + } + + if (governRegistryInstance?.address !== registryAddress || governRegistryInstance == null) { + governRegistryInstance = new Contract(registryAddress, registryAbi, signer) + } + + // start a new subscription + governRegistryInstance.on( + 'Registered', + async (excecutor, queue, token, minter, registrant, name) => { + // not our DAO, wait for next one + if (name !== daoName) return + // send back token address and excecutor + fn(token, excecutor) + } + ) +} diff --git a/yarn.lock b/yarn.lock index 7fa590a19..93be225c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,29 @@ # yarn lockfile v1 -"@apollo/protobufjs@^1.0.3": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.5.tgz#a78b726147efc0795e74c8cb8a11aafc6e02f773" - integrity sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA== +"@apollo/client@^3.3.14": + version "3.3.16" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.16.tgz#e4a51b0f86583b18ab81723660e381ef616536c1" + integrity sha512-EPTiNpmiU6/vvxpl4lXWQDqS3YddweC1sh/ewCuVP9IK0+xlVGb5vR1yhM/7T3PIJqwz52dGpZyJskmbTfENfQ== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.4.0" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.12.0" + hoist-non-react-statics "^3.3.2" + optimism "^0.15.0" + prop-types "^15.7.2" + symbol-observable "^2.0.0" + ts-invariant "^0.7.0" + tslib "^1.10.0" + zen-observable "^0.8.14" + +"@apollo/protobufjs@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" + integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -21,19 +40,19 @@ "@types/node" "^10.1.0" long "^4.0.0" -"@apollographql/apollo-tools@^0.4.3": - version "0.4.9" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.9.tgz#6abeef4c4586aec8208f71254b329e48ab50c07e" - integrity sha512-M50pk8oo3CGTu4waGOklIX3YtTZoPfWG9K/G9WB8NpyQGA1OwYTiBFv94XqUtKElTDoFwoMXpMQd3Wy5dINvxA== +"@apollographql/apollo-tools@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.0.tgz#81aadcabb35eeab6ef7e0d3d6c592a6fe15e66d9" + integrity sha512-7IOZHVaKjBq44StXFJEITl4rxgZCsZFSWogAvIErKR9DYV20rt9bJ2mY5lCn+zghfGrweykjLb9g4TDxLg750w== dependencies: - apollo-env "^0.6.6" + apollo-env "^0.10.0" -"@apollographql/graphql-playground-html@1.6.26": - version "1.6.26" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3" - integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ== +"@apollographql/graphql-playground-html@1.6.27": + version "1.6.27" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz#bc9ab60e9445aa2a8813b4e94f152fa72b756335" + integrity sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw== dependencies: - xss "^1.0.6" + xss "^1.0.8" "@apollographql/graphql-upload-8-fork@^8.1.3": version "8.1.3" @@ -65,6 +84,35 @@ "@web3-react/types" "^6.0.7" tiny-warning "^1.0.3" +"@aragon/ui@https://github.com/aragon/ui.git#v2": + version "1.7.0" + resolved "https://github.com/aragon/ui.git#3626256dfdeb0ee0a2440b79952dff5aa671c37e" + dependencies: + "@babel/runtime" "^7.3.1" + airbnb-prop-types "^2.9.0" + arg "^2.0.0" + command-exists "^1.2.6" + dayjs "^1.8.14" + js-sha3 "^0.8.0" + jsbi "^3.1.2" + lodash "^4.17.19" + markdown-to-jsx "^6.11.0" + popper.js "^1.14.4" + prop-types "^15.6.0" + react-blockies "^1.4.0" + react-display-name "^0.2.3" + react-onclickout "^2.0.8" + react-spring "^7.2.11" + recursive-copy "^2.0.9" + token-amount "^0.1.0" + use-inside "^0.2.0" + use-token "^0.2.0" + +"@assemblyscript/loader@^0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.9.4.tgz#a483c54c1253656bb33babd464e3154a173e1577" + integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== + "@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" @@ -86,10 +134,10 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6" - integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@7.12.3": version "7.12.3" @@ -113,34 +161,33 @@ 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.13.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.8.tgz#c191d9c5871788a591d69ea1dc03e5843a3680fb" - integrity sha512-oYapIySGw1zGhEFRd6lzWNLWFX2s5dA/jm+Pw/+59ZdXtjyIuwlXbrId22Md0rgZVop+aVoqow2riXhBLNyuQg== +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helpers" "^7.13.0" - "@babel/parser" "^7.13.4" + "@babel/generator" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.13.0": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.12.1", "@babel/generator@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" + integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.14.1" jsesc "^2.5.1" source-map "^0.5.0" @@ -159,25 +206,26 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz#02bdb22783439afb11b2f009814bdd88384bd468" - integrity sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== dependencies: - "@babel/compat-data" "^7.13.8" + "@babel/compat-data" "^7.13.15" "@babel/helper-validator-option" "^7.12.17" browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.13.0": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.8.tgz#0367bd0a7505156ce018ca464f7ac91ba58c1a04" - integrity sha512-qioaRrKHQbn4hkRKDHbnuQ6kAxmmOF+kzKGnIfxPK4j2rckSJCpKzr/SSTlohSCiE3uAQpNDJ9FIh4baeE8W+w== +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz#1fe11b376f3c41650ad9fedc665b0068722ea76c" + integrity sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg== dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": @@ -188,10 +236,10 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" - integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -226,41 +274,40 @@ "@babel/types" "^7.12.13" "@babel/helper-hoist-variables@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" - integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" + integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== dependencies: - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.16" -"@babel/helper-member-expression-to-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" - integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== +"@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.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" - integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - lodash "^4.17.19" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -283,22 +330,22 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" - integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.13.12" -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -314,10 +361,10 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.17": version "7.12.17" @@ -334,33 +381,42 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" - integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.8.tgz#10b2dac78526424dfc1f47650d0e415dfd9dc481" - integrity sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.13.0", "@babel/parser@^7.13.4", "@babel/parser@^7.7.0": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99" - integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.0", "@babel/parser@^7.7.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1" - integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" + integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" @@ -382,6 +438,14 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-class-static-block@^7.13.11": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz#6fcbba4a962702c17e5371a0c7b39afde186d703" + integrity sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@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" @@ -483,10 +547,10 @@ "@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.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz#e39df93efe7e7e621841babc197982e140e90756" - integrity sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ== +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" + integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" @@ -500,6 +564,16 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -529,6 +603,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-decorators@^7.12.1": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -620,6 +701,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -657,12 +745,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz#ac1b3a8e3d8cbb31efc6b9be2f74eb9823b74ab2" + integrity sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.13.0": version "7.13.0" @@ -684,10 +772,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" - integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" + integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -751,23 +839,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" + integrity sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-simple-access" "^7.13.12" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.13.8": @@ -781,12 +869,12 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": @@ -825,12 +913,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz#f8ee56888545d53d80f766b3cc1563ab2c241f92" - integrity sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ== +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz#0208b1d942bf939cd4f7aa5b255d42602aa4a920" + integrity sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-react-display-name@7.12.1": version "7.12.1" @@ -846,7 +934,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.12.12": +"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== @@ -867,16 +955,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" - integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== +"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" + integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.17" + "@babel/types" "^7.13.12" "@babel/plugin-transform-react-pure-annotations@^7.12.1": version "7.12.1" @@ -886,10 +974,10 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" - integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" + integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== dependencies: regenerator-transform "^0.14.2" @@ -911,15 +999,15 @@ semver "^5.5.1" "@babel/plugin-transform-runtime@^7.5.5": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.9.tgz#744d3103338a0d6c90dee0497558150b490cee07" - integrity sha512-XCxkY/wBI6M6Jj2mlWxkmqbKPweRanszWbF3Tyut+hKh+PHcuIH/rSr/7lmmE7C3WW+HSIm2GT+d5jwmheuB0g== + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" + integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== dependencies: - "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" "@babel/helper-plugin-utils" "^7.13.0" - babel-plugin-polyfill-corejs2 "^0.1.4" - babel-plugin-polyfill-corejs3 "^0.1.3" - babel-plugin-polyfill-regenerator "^0.1.2" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.12.13": @@ -1054,17 +1142,19 @@ core-js-compat "^3.6.2" semver "^5.5.0" -"@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.9.tgz#3ee5f233316b10d066d7f379c6d1e13a96853654" - integrity sha512-mcsHUlh2rIhViqMG823JpscLMesRt3QbMsv1+jhopXEb3W2wXvQ9QoiOlZI9ZbR3XqPtaFpZwEZKYqGJnGMZTQ== +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.8.4": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.1.tgz#b55914e2e68885ea03f69600b2d3537e54574a93" + integrity sha512-0M4yL1l7V4l+j/UHvxcdvNfLB9pPtIooHTbEhgD/6UGyh8Hy3Bm1Mj0buzjDXATCSz3JFibVdnoJZCrlUCanrQ== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-proposal-async-generator-functions" "^7.13.8" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.13.15" "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-class-static-block" "^7.13.11" "@babel/plugin-proposal-dynamic-import" "^7.13.8" "@babel/plugin-proposal-export-namespace-from" "^7.12.13" "@babel/plugin-proposal-json-strings" "^7.13.8" @@ -1073,11 +1163,13 @@ "@babel/plugin-proposal-numeric-separator" "^7.12.13" "@babel/plugin-proposal-object-rest-spread" "^7.13.8" "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -1087,14 +1179,15 @@ "@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.0" "@babel/plugin-syntax-top-level-await" "^7.12.13" "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.14.1" "@babel/plugin-transform-classes" "^7.13.0" "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.17" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" @@ -1102,16 +1195,16 @@ "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/plugin-transform-modules-amd" "^7.14.0" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" "@babel/plugin-transform-parameters" "^7.13.0" "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" "@babel/plugin-transform-shorthand-properties" "^7.12.13" "@babel/plugin-transform-spread" "^7.13.0" @@ -1121,10 +1214,10 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.0" - babel-plugin-polyfill-corejs2 "^0.1.4" - babel-plugin-polyfill-corejs3 "^0.1.3" - babel-plugin-polyfill-regenerator "^0.1.2" + "@babel/types" "^7.14.1" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" core-js-compat "^3.9.0" semver "^6.3.0" @@ -1152,15 +1245,16 @@ "@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.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== +"@babel/preset-react@^7.12.5": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.13.13.tgz#fa6895a96c50763fe693f9148568458d5a839761" + integrity sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" + "@babel/plugin-transform-react-jsx" "^7.13.12" + "@babel/plugin-transform-react-jsx-development" "^7.12.17" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/preset-typescript@7.12.1": @@ -1172,9 +1266,9 @@ "@babel/plugin-transform-typescript" "^7.12.1" "@babel/runtime-corejs3@^7.10.2": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.13.9.tgz#b2fa9a6e5690ef8d4c4f2d30cac3ec1a8bb633ce" - integrity sha512-p6WSr71+5u/VBf1KDS/Y4dK3ZwbV+DD6wQO3X2EbUVluEOiyXUk09DzcwSaUH4WomYXrEPC+i2rqzuthhZhOJw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz#6bf5fbc0b961f8e3202888cb2cd0fb7a0a9a3f66" + integrity sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" @@ -1193,10 +1287,10 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee" - integrity sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -1209,28 +1303,26 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" - integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" + "@babel/generator" "^7.14.0" "@babel/helper-function-name" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.13.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" - integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.6", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.1", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1261,6 +1353,18 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@date-io/core@1.x", "@date-io/core@^1.3.13": + version "1.3.13" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.13.tgz#90c71da493f20204b7a972929cc5c482d078b3fa" + integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA== + +"@date-io/moment@^1.3.13": + version "1.3.13" + resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-1.3.13.tgz#56c2772bc4f6675fc6970257e6033e7a7c2960f0" + integrity sha512-3kJYusJtQuOIxq6byZlzAHoW/18iExJer9qfRF5DyyzdAk074seTuJfdofjz4RFfTd/Idk8WylOQpWtERqvFuQ== + dependencies: + "@date-io/core" "^1.3.13" + "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -1275,6 +1379,11 @@ combined-stream "^1.0.8" mime-types "^2.1.12" +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + "@emotion/is-prop-valid@^0.8.8": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" @@ -1329,17 +1438,17 @@ strip-json-comments "^3.1.1" "@ethereum-waffle/chai@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.3.0.tgz#8aba94be27535cf12419e545e5f7027226ef732f" - integrity sha512-KqPH9DdTmfgM6dGa6M7/rUillYdRsUVkIiFLgVdLDvtaALITb6IseGNGRRerG/J6wUeIUQxOJY0ACZRYPCItaQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.3.1.tgz#3f20b810d0fa516f19af93c50c3be1091333fa8e" + integrity sha512-+vepCjttfOzCSnmiVEmd1bR8ctA2wYVrtWa8bDLhnTpj91BIIHotNDTwpeq7fyjrOCIBTN3Ai8ACfjNoatc4OA== dependencies: - "@ethereum-waffle/provider" "^3.3.0" + "@ethereum-waffle/provider" "^3.3.1" ethers "^5.0.0" "@ethereum-waffle/compiler@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.3.0.tgz#26c2e9228f7118961625f3ace179b6c7004e9a6f" - integrity sha512-q5Nd0vlLeEYKszdJUNvIIuP2vj/tFkWt1LCvsIcFHIzxyIoLeaCFNzJI0UQ/s298svfPY59SyL7dKNcQWwbaWQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.3.1.tgz#946128fd565aa4347075fd716dbd0f3f38189280" + integrity sha512-X/TeQugt94AQwXEdCjIQxcXYGawNulVBYEBE7nloj4wE/RBxNolXwjoVNjcS4kuiMMbKkdO0JkL5sn6ixx8bDg== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" @@ -1353,10 +1462,10 @@ ts-generator "^0.1.1" typechain "^3.0.0" -"@ethereum-waffle/ens@^3.2.2": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.3.tgz#970f51e16a140e4e99c7b7831713d645be63aacb" - integrity sha512-OIfguJu4e+NYJHNnNVaFzvNG5WYPntWU1vnQuAFszBFytOeIkv2hAXv8RmRL+cledcvShtP3gmXU3Lvf0o4Sxw== +"@ethereum-waffle/ens@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.4.tgz#c486be4879ea7107e1ff01b24851a5e44f5946ce" + integrity sha512-lkRVPCEkk7KOwH9MqFMB+gL0X8cZNsm+MnKpP9CNbAyhFos2sCDGcY8t6BA12KBK6pdMuuRXPxYL9WfPl9bqSQ== dependencies: "@ensdomains/ens" "^0.4.4" "@ensdomains/resolver" "^0.2.4" @@ -1370,17 +1479,68 @@ "@ethersproject/abi" "^5.0.1" ethers "^5.0.1" -"@ethereum-waffle/provider@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.3.0.tgz#3cacdb597ab04127c4c0b8a5b13e95ea33e932ab" - integrity sha512-JcHGwDz8ciqwDXcZXLzOif8AY2n4fUG5ju0ZQCGRkYiRHHTrbqzwWAtFsEHetWAxCi3VGlSgeN833DGulnQaZg== +"@ethereum-waffle/provider@^3.3.0", "@ethereum-waffle/provider@^3.3.1": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.3.2.tgz#33677baf6af5cbb087c3072d84f38c152968ebb1" + integrity sha512-ilz6cXK0ylSKCmZktTMpY4gjo0CN6rb86JfN7+RZYk6tKtZA6sXoOe95skWEQkGf1fZk7G817fTzLb0CmFDp1g== dependencies: - "@ethereum-waffle/ens" "^3.2.2" + "@ethereum-waffle/ens" "^3.2.4" ethers "^5.0.1" - ganache-core "^2.10.2" + ganache-core "^2.13.2" patch-package "^6.2.2" postinstall-postinstall "^2.1.0" +"@ethereumjs/block@^3.2.0", "@ethereumjs/block@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.2.1.tgz#c24c345e6dd6299efa4bed40979280b7dda96d3a" + integrity sha512-FCxo5KwwULne2A2Yuae4iaGGqSsRjwzXOlDhGalOFiBbLfP3hE04RHaHGw4c8vh1PfOrLauwi0dQNUBkOG3zIA== + dependencies: + "@ethereumjs/common" "^2.2.0" + "@ethereumjs/tx" "^3.1.3" + ethereumjs-util "^7.0.10" + merkle-patricia-tree "^4.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.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.2.1.tgz#83ed83647667265f1666f111caf065ef9d1e82b5" + integrity sha512-+hshP2qSOOFsiYvZCbaDQFG7jYTWafE8sfBi+pAsdhAHfP7BN7VLyob7qoQISgwS1s7NTR4c4+2t/woU9ahItw== + dependencies: + "@ethereumjs/block" "^3.2.0" + "@ethereumjs/common" "^2.2.0" + "@ethereumjs/ethash" "^1.0.0" + debug "^2.2.0" + ethereumjs-util "^7.0.9" + level-mem "^5.0.1" + lru-cache "^5.1.1" + rlp "^2.2.4" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.2.0.tgz#850a3e3e594ee707ad8d44a11e8152fb62450535" + integrity sha512-PyQiTG00MJtBRkJmv46ChZL8u2XWxNBeAthznAUIUiefxPAXjbkuiCZOuncgJS34/XkMbNc9zMt/PlgKRBElig== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.0.9" + +"@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/config-tsc@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@ethereumjs/config-tsc/-/config-tsc-1.1.1.tgz#e2755f16f4e0ee793029f19a9bc1a41dd833aba0" @@ -1391,6 +1551,51 @@ resolved "https://registry.yarnpkg.com/@ethereumjs/config-tslint/-/config-tslint-1.1.1.tgz#dc9f15aacaf2f792de96eba75f78fce4360324bb" integrity sha512-3Z6M16l20rDRptCOFuKxsn9uypkdNE+5S768ICSbe5KgoyPLjPiHRaSdo76FkFwK5JO6X1Cx5+3tbyDUMBb1jA== +"@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.1.3": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.1.4.tgz#04cf9e9406da5f04a1a26c458744641f4b4b8dd0" + integrity sha512-6cJpmmjCpG5ZVN9NJYtWvmrEQcevw9DIR8hj2ca2PszD2fxbIFXky3Z37gpf8S6u0Npv09kG8It+G4xjydZVLg== + dependencies: + "@ethereumjs/common" "^2.2.0" + ethereumjs-util "^7.0.10" + +"@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.3.2": + version "5.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.3.2.tgz#b4d83a3d50a7ad22d6d412cc21bbde221b3e2871" + integrity sha512-QmCUQrW6xbhgEbQh9njue4kAJdM056C+ytBFUTF/kDYa3kNDm4Qxp9HUyTlt1OCSXvDhws0qqlh8+q+pmXpN7g== + dependencies: + "@ethereumjs/block" "^3.2.1" + "@ethereumjs/blockchain" "^5.2.1" + "@ethereumjs/common" "^2.2.0" + "@ethereumjs/tx" "^3.1.3" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^2.2.0" + ethereumjs-util "^7.0.10" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.1.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" @@ -1406,21 +1611,6 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.12", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.10", "@ethersproject/abi@^5.0.2": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.12.tgz#9aebe6aedc05ce45bb6c41b06d80bd195b7de77c" - integrity sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q== - dependencies: - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/hash" "^5.0.10" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - "@ethersproject/abi@5.0.7": version "5.0.7" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" @@ -1436,326 +1626,690 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/abstract-provider@5.0.9", "@ethersproject/abstract-provider@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz#a55410b73e3994842884eb82b1f43e3a9f653eea" - integrity sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ== +"@ethersproject/abi@5.1.2", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.2", "@ethersproject/abi@^5.1.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.1.2.tgz#a8e75cd0455e6dc9e4861c3d1c22bbe436c1d775" + integrity sha512-uMhoQVPX0UtfzTpekYQSEUcJGDgsJ25ifz+SV6PDETWaUFhcR8RNgb1QPTASP13inW8r6iy0/Xdq9D5hK2pNvA== + dependencies: + "@ethersproject/address" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/hash" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + +"@ethersproject/abi@5.4.0", "@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.1.0", "@ethersproject/abstract-provider@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz#1f24c56cda5524ef4ed3cfc562a01d6b6f8eeb0b" + integrity sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ== + dependencies: + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/networks" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/transactions" "^5.1.0" + "@ethersproject/web" "^5.1.0" + +"@ethersproject/abstract-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-signer@5.1.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz#744c7a2d0ebe3cc0bc38294d0f53d5ca3f4e49e3" + integrity sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w== dependencies: - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/networks" "^5.0.7" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/transactions" "^5.0.9" - "@ethersproject/web" "^5.0.12" - -"@ethersproject/abstract-signer@5.0.13", "@ethersproject/abstract-signer@^5.0.10", "@ethersproject/abstract-signer@^5.0.2": - version "5.0.13" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz#59b4d0367d6327ec53bc269c6730c44a4a3b043c" - integrity sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ== - dependencies: - "@ethersproject/abstract-provider" "^5.0.8" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" + "@ethersproject/abstract-provider" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" -"@ethersproject/address@5.0.10", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.9": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.10.tgz#2bc69fdff4408e0570471cd19dee577ab06a10d0" - integrity sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw== +"@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/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/rlp" "^5.0.7" + "@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/base64@5.0.8", "@ethersproject/base64@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.8.tgz#1bc4b4b8c59c1debf972c7164b96c0b8964a20a1" - integrity sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg== +"@ethersproject/address@5.1.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.1.0.tgz#3854fd7ebcb6af7597de66f847c3345dae735b58" + integrity sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg== dependencies: - "@ethersproject/bytes" "^5.0.9" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/rlp" "^5.1.0" -"@ethersproject/basex@5.0.8", "@ethersproject/basex@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.8.tgz#6867fad20047aa29fbd4b880f27894ed04cc7bb8" - integrity sha512-PCVKZIShBQUqAXjJSvaCidThPvL0jaaQZcewJc0sf8Xx05BizaOS8r3jdPdpNdY+/qZtRDqwHTSKjvR/xssyLQ== +"@ethersproject/address@5.4.0", "@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/bytes" "^5.0.9" - "@ethersproject/properties" "^5.0.7" + "@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/bignumber@5.0.14", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.13", "@ethersproject/bignumber@^5.0.5", "@ethersproject/bignumber@^5.0.7": - version "5.0.14" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.14.tgz#605bc61dcbd4a8c6df8b5a7a77c0210273f3de8a" - integrity sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw== +"@ethersproject/base64@5.1.0", "@ethersproject/base64@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.1.0.tgz#27240c174d0a4e13f6eae87416fd876caf7f42b6" + integrity sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.1.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.1.0", "@ethersproject/basex@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.1.0.tgz#80da2e86f9da0cb5ccd446b337364d791f6a131c" + integrity sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg== + dependencies: + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/properties" "^5.1.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.1.1", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.1.1.tgz#84812695253ccbc639117f7ac49ee1529b68e637" + integrity sha512-AVz5iqz7+70RIqoQTznsdJ6DOVBYciNlvO+AlQmPTB6ofCvoihI9bQdr6wljsX+d5W7Yc4nyvQvP4JMzg0Agig== + dependencies: + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" bn.js "^4.4.0" -"@ethersproject/bytes@5.0.10", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.2", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.9": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.10.tgz#aa49afe7491ba24ff76fa33d98677351263f9ba4" - integrity sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA== +"@ethersproject/bignumber@5.4.0", "@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/logger" "^5.0.8" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + bn.js "^4.11.9" -"@ethersproject/constants@5.0.9", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.9.tgz#81ac44c3bf612de63eb1c490b314ea1b932cda9f" - integrity sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg== +"@ethersproject/bytes@5.1.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.9", "@ethersproject/bytes@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.1.0.tgz#55dfa9c4c21df1b1b538be3accb50fb76d5facfd" + integrity sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g== dependencies: - "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/logger" "^5.1.0" -"@ethersproject/contracts@5.0.11", "@ethersproject/contracts@^5.0.2": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.11.tgz#e6cc57698a05be2329cb2ca3d7e87686f95e438a" - integrity sha512-FTUUd/6x00dYL2VufE2VowZ7h3mAyBfCQMGwI3tKDIWka+C0CunllFiKrlYCdiHFuVeMotR65dIcnzbLn72MCw== +"@ethersproject/bytes@5.4.0", "@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/abi" "^5.0.10" - "@ethersproject/abstract-provider" "^5.0.8" - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - -"@ethersproject/hash@5.0.11", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.10", "@ethersproject/hash@^5.0.4": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.11.tgz#da89517438bbbf8a39df56fff09f0a71669ae7a7" - integrity sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g== - dependencies: - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - -"@ethersproject/hdnode@5.0.9", "@ethersproject/hdnode@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.9.tgz#ce65b430d3d3f0cd3c8f9dfaaf376b55881d9dba" - integrity sha512-S5UMmIC6XfFtqhUK4uTjD8GPNzSbE+sZ/0VMqFnA3zAJ+cEFZuEyhZDYnl2ItGJzjT4jsy+uEy1SIl3baYK1PQ== - dependencies: - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/basex" "^5.0.7" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/pbkdf2" "^5.0.7" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/sha2" "^5.0.7" - "@ethersproject/signing-key" "^5.0.8" - "@ethersproject/strings" "^5.0.8" - "@ethersproject/transactions" "^5.0.9" - "@ethersproject/wordlists" "^5.0.8" - -"@ethersproject/json-wallets@5.0.11", "@ethersproject/json-wallets@^5.0.10": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.11.tgz#86fdc41b7762acb443d6a896f6c61231ab2aee5d" - integrity sha512-0GhWScWUlXXb4qJNp0wmkU95QS3YdN9UMOfMSEl76CRANWWrmyzxcBVSXSBu5iQ0/W8wO+xGlJJ3tpA6v3mbIw== - dependencies: - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/hdnode" "^5.0.8" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/pbkdf2" "^5.0.7" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/random" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - "@ethersproject/transactions" "^5.0.9" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/constants@5.1.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.1.0.tgz#4e7da6367ea0e9be87585d8b09f3fccf384b1452" + integrity sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw== + dependencies: + "@ethersproject/bignumber" "^5.1.0" + +"@ethersproject/constants@5.4.0", "@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.1.1", "@ethersproject/contracts@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.1.1.tgz#c66cb6d618fcbd73e20a6b808e8f768b2b781d0b" + integrity sha512-6WwktLJ0DFWU8pDkgH4IGttQHhQN4SnwKFu9h+QYVe48VGWtbDu4W8/q/7QA1u/HWlWMrKxqawPiZUJj0UMvOw== + dependencies: + "@ethersproject/abi" "^5.1.0" + "@ethersproject/abstract-provider" "^5.1.0" + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/address" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/transactions" "^5.1.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/hash@5.1.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.1.0.tgz#40961d64837d57f580b7b055e0d74174876d891e" + integrity sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ== + dependencies: + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/address" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + +"@ethersproject/hash@5.4.0", "@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.1.0", "@ethersproject/hdnode@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.1.0.tgz#2bf5c4048935136ce83e9242e1bd570afcc0bc83" + integrity sha512-obIWdlujloExPHWJGmhJO/sETOOo7SEb6qemV4f8kyFoXg+cJK+Ta9SvBrj7hsUK85n3LZeZJZRjjM7oez3Clg== + dependencies: + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/basex" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/pbkdf2" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/sha2" "^5.1.0" + "@ethersproject/signing-key" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + "@ethersproject/transactions" "^5.1.0" + "@ethersproject/wordlists" "^5.1.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.1.0", "@ethersproject/json-wallets@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.1.0.tgz#bba7af2e520e8aea4d3829d80520db5d2e4fb8d2" + integrity sha512-00n2iBy27w8zrGZSiU762UOVuzCQZxUZxopsZC47++js6xUFuI74DHcJ5K/2pddlF1YBskvmMuboEu1geK8mnA== + dependencies: + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/address" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/hdnode" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/pbkdf2" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/random" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + "@ethersproject/transactions" "^5.1.0" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.0.8", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.8.tgz#13aaf69e1c8bd15fc59a2ebd055c0878f2a059c8" - integrity sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ== +"@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.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.7.tgz#2eedb5e4c160fcdf0079660f8ae362d7855ea943" + integrity sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g== dependencies: "@ethersproject/bytes" "^5.0.9" js-sha3 "0.5.7" -"@ethersproject/logger@5.0.9", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.9.tgz#0e6a0b3ecc938713016954daf4ac7967467aa763" - integrity sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw== +"@ethersproject/keccak256@5.1.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.1.0.tgz#fdcd88fb13bfef4271b225cdd8dec4d315c8e60e" + integrity sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig== + dependencies: + "@ethersproject/bytes" "^5.1.0" + js-sha3 "0.5.7" -"@ethersproject/networks@5.0.8", "@ethersproject/networks@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.8.tgz#37e6f8c058f2d540373ea5939056cd3de069132e" - integrity sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA== +"@ethersproject/keccak256@5.4.0", "@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.1.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.1.0.tgz#4cdeeefac029373349d5818f39c31b82cc6d9bbf" + integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw== + +"@ethersproject/logger@5.4.0", "@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.1.0", "@ethersproject/networks@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.1.0.tgz#f537290cb05aa6dc5e81e910926c04cfd5814bca" + integrity sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA== dependencies: - "@ethersproject/logger" "^5.0.8" + "@ethersproject/logger" "^5.1.0" -"@ethersproject/pbkdf2@5.0.8", "@ethersproject/pbkdf2@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.8.tgz#06a086b1ac04c75e6846afd6cf6170a49a634411" - integrity sha512-UlmAMGbIPaS2xXsI38FbePVTfJMuU9jnwcqVn3p88HxPF4kD897ha+l3TNsBqJqf32UbQL5GImnf1oJkSKq4vQ== +"@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/bytes" "^5.0.9" - "@ethersproject/sha2" "^5.0.7" + "@ethersproject/logger" "^5.4.0" -"@ethersproject/properties@5.0.8", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.8.tgz#e45d28d25402c73394873dbf058f856c966cae01" - integrity sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw== +"@ethersproject/pbkdf2@5.1.0", "@ethersproject/pbkdf2@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz#6b740a85dc780e879338af74856ca2c0d3b24d19" + integrity sha512-B8cUbHHTgs8OtgJIafrRcz/YPDobVd5Ru8gTnShOiM9EBuFpYHQpq3+8iQJ6pyczDu6HP/oc/njAsIBhwFZYew== dependencies: - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/sha2" "^5.1.0" -"@ethersproject/providers@5.0.23", "@ethersproject/providers@^5.0.5": - version "5.0.23" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.23.tgz#1e26512303d60bbd557242532fdb5fa3c5d5fb73" - integrity sha512-eJ94z2tgPaUgUmxwd3BVkIzkgkbNIkY6wRPVas04LVaBTycObQbgj794aaUu2bfk7+Bn2B/gjUZtJW1ybxh9/A== +"@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/abstract-provider" "^5.0.8" - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/basex" "^5.0.7" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/hash" "^5.0.10" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/networks" "^5.0.7" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/random" "^5.0.7" - "@ethersproject/rlp" "^5.0.7" - "@ethersproject/sha2" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - "@ethersproject/transactions" "^5.0.9" - "@ethersproject/web" "^5.0.12" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + +"@ethersproject/properties@5.1.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.1.0.tgz#9484bd6def16595fc6e4bdc26f29dff4d3f6ac42" + integrity sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg== + dependencies: + "@ethersproject/logger" "^5.1.0" + +"@ethersproject/properties@5.4.0", "@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.1.2", "@ethersproject/providers@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.1.2.tgz#4e4459698903f911402fe91aa7544eb07f3921ed" + integrity sha512-GqsS8rd+eyd4eNkcNgzZ4l9IRULBPUZa7JPnv22k4MHflMobUseyhfbVnmoN5bVNNkOxjV1IPTw9i0sV1hwdpg== + dependencies: + "@ethersproject/abstract-provider" "^5.1.0" + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/address" "^5.1.0" + "@ethersproject/basex" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/hash" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/networks" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/random" "^5.1.0" + "@ethersproject/rlp" "^5.1.0" + "@ethersproject/sha2" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + "@ethersproject/transactions" "^5.1.0" + "@ethersproject/web" "^5.1.0" bech32 "1.1.4" ws "7.2.3" -"@ethersproject/random@5.0.8", "@ethersproject/random@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.8.tgz#8d3726be48e95467abce9b23c93adbb1de009dda" - integrity sha512-4rHtotmd9NjklW0eDvByicEkL+qareIyFSbG1ShC8tPJJSAC0g55oQWzw+3nfdRCgBHRuEE7S8EcPcTVPvZ9cA== +"@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/random@5.1.0", "@ethersproject/random@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.1.0.tgz#0bdff2554df03ebc5f75689614f2d58ea0d9a71f" + integrity sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" -"@ethersproject/rlp@5.0.8", "@ethersproject/rlp@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.8.tgz#ff54e206d0ae28640dd054f2bcc7070f06f9dfbe" - integrity sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg== +"@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.0.9" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" -"@ethersproject/sha2@5.0.8", "@ethersproject/sha2@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.8.tgz#9903c67e562739d8b312820b0a265b9c9bf35fc3" - integrity sha512-ILP1ZgyvDj4rrdE+AXrTv9V88m7x87uga2VZ/FeULKPumOEw/4bGnJz/oQ8zDnDvVYRCJ+48VaQBS2CFLbk1ww== +"@ethersproject/rlp@5.1.0", "@ethersproject/rlp@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.1.0.tgz#700f4f071c27fa298d3c1d637485fefe919dd084" + integrity sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.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.1.0", "@ethersproject/sha2@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.1.0.tgz#6ca42d1a26884b3e32ffa943fe6494af7211506c" + integrity sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA== + dependencies: + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" hash.js "1.1.3" -"@ethersproject/signing-key@5.0.10", "@ethersproject/signing-key@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.10.tgz#05e26e04f0aa5360dc78674d7331bacea8fea5c1" - integrity sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA== +"@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.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.1.0", "@ethersproject/signing-key@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.1.0.tgz#6eddfbddb6826b597b9650e01acf817bf8991b9c" + integrity sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw== + dependencies: + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + bn.js "^4.4.0" elliptic "6.5.4" -"@ethersproject/solidity@5.0.9", "@ethersproject/solidity@^5.0.2": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.9.tgz#49100fbe9f364ac56f7ff7c726f4f3d151901134" - integrity sha512-LIxSAYEQgLRXE3mRPCq39ou61kqP8fDrGqEeNcaNJS3aLbmAOS8MZp56uK++WsdI9hj8sNsFh78hrAa6zR9Jag== +"@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/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/sha2" "^5.0.7" - "@ethersproject/strings" "^5.0.8" + "@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/strings@5.0.9", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.9.tgz#8e2eb2918b140231e1d1b883d77e43213a8ac280" - integrity sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q== +"@ethersproject/solidity@5.1.0", "@ethersproject/solidity@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.1.0.tgz#095a9c75244edccb26c452c155736d363399b954" + integrity sha512-kPodsGyo9zg1g9XSXp1lGhFaezBAUUsAUB1Vf6OkppE5Wksg4Et+x3kG4m7J/uShDMP2upkJtHNsIBK2XkVpKQ== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/sha2" "^5.1.0" + "@ethersproject/strings" "^5.1.0" -"@ethersproject/transactions@5.0.10", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.2", "@ethersproject/transactions@^5.0.9": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.10.tgz#d50cafd80d27206336f80114bc0f18bc18687331" - integrity sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w== +"@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/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/rlp" "^5.0.7" - "@ethersproject/signing-key" "^5.0.8" - -"@ethersproject/units@5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.10.tgz#9cca3b65cd0c92fab1bd33f2abd233546dd61987" - integrity sha512-eaiHi9ham5lbC7qpqxpae7OY/nHJUnRUnFFuEwi2VB5Nwe3Np468OAV+e+HR+jAK4fHXQE6PFBTxWGtnZuO37g== - dependencies: - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/wallet@5.0.11", "@ethersproject/wallet@^5.0.2": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.11.tgz#9891936089d1b91e22ed59f850bc344b1544bf26" - integrity sha512-2Fg/DOvUltR7aZTOyWWlQhru+SKvq2UE3uEhXSyCFgMqDQNuc2nHXh1SHJtN65jsEbjVIppOe1Q7EQMvhmeeRw== - dependencies: - "@ethersproject/abstract-provider" "^5.0.8" - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/hash" "^5.0.10" - "@ethersproject/hdnode" "^5.0.8" - "@ethersproject/json-wallets" "^5.0.10" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/random" "^5.0.7" - "@ethersproject/signing-key" "^5.0.8" - "@ethersproject/transactions" "^5.0.9" - "@ethersproject/wordlists" "^5.0.8" - -"@ethersproject/web@5.0.13", "@ethersproject/web@^5.0.12": - version "5.0.13" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.13.tgz#5a92ac6d835d2ebce95b6b645a86668736e2f532" - integrity sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ== - dependencies: - "@ethersproject/base64" "^5.0.7" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" + "@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/wordlists@5.0.9", "@ethersproject/wordlists@^5.0.8": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.9.tgz#f16cc0b317637c3ae9c689ebd7bc2cbbffadd013" - integrity sha512-Sn6MTjZkfbriod6GG6+p43W09HOXT4gwcDVNj0YoPYlo4Zq2Fk6b1CU9KUX3c6aI17PrgYb4qwZm5BMuORyqyQ== +"@ethersproject/strings@5.1.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.1.0.tgz#0f95a56c3c8c9d5510a06c241d818779750e2da5" + integrity sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/hash" "^5.0.10" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + +"@ethersproject/strings@5.4.0", "@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.1.1", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.1.1.tgz#5a6bbb25fb062c3cc75eb0db12faefcdd3870813" + integrity sha512-Nwgbp09ttIVN0OoUBatCXaHxR7grWPHbozJN8v7AXDLrl6nnOIBEMDh+yJTnosSQlFhcyjfTGGN+Mx6R8HdvMw== + dependencies: + "@ethersproject/address" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/rlp" "^5.1.0" + "@ethersproject/signing-key" "^5.1.0" + +"@ethersproject/transactions@5.4.0", "@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.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.1.0.tgz#b6ab3430ebc22adc3cb4839516496f167bee3ad5" + integrity sha512-isvJrx6qG0nKWfxsGORNjmOq/nh175fStfvRTA2xEKrGqx8JNJY83fswu4GkILowfriEM/eYpretfJnfzi7YhA== + dependencies: + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/constants" "^5.1.0" + "@ethersproject/logger" "^5.1.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.1.0", "@ethersproject/wallet@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.1.0.tgz#134c5816eaeaa586beae9f9ff67891104a2c9a15" + integrity sha512-ULmUtiYQLTUS+y3DgkLzRhFEK10zMwmjOthnjiZxee3Q/MVwr3rnmuAnXIUZrPjna6hvUPnyRIdW5XuF0Ld0YQ== + dependencies: + "@ethersproject/abstract-provider" "^5.1.0" + "@ethersproject/abstract-signer" "^5.1.0" + "@ethersproject/address" "^5.1.0" + "@ethersproject/bignumber" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/hash" "^5.1.0" + "@ethersproject/hdnode" "^5.1.0" + "@ethersproject/json-wallets" "^5.1.0" + "@ethersproject/keccak256" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/random" "^5.1.0" + "@ethersproject/signing-key" "^5.1.0" + "@ethersproject/transactions" "^5.1.0" + "@ethersproject/wordlists" "^5.1.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.1.0", "@ethersproject/web@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.1.0.tgz#ed56bbe4e3d9a8ffe3b2ed882da5c62d3551381b" + integrity sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA== + dependencies: + "@ethersproject/base64" "^5.1.0" + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/strings" "^5.1.0" + +"@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.1.0", "@ethersproject/wordlists@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.1.0.tgz#54eb9ef3a00babbff90ffe124e19c89e07e6aace" + integrity sha512-NsUCi/TpBb+oTFvMSccUkJGtp5o/84eOyqp5q5aBeiNBSLkYyw21znRn9mAmxZgySpxgruVgKbaapnYPgvctPQ== + dependencies: + "@ethersproject/bytes" "^5.1.0" + "@ethersproject/hash" "^5.1.0" + "@ethersproject/logger" "^5.1.0" + "@ethersproject/properties" "^5.1.0" + "@ethersproject/strings" "^5.1.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" "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" @@ -1866,26 +2420,174 @@ dependencies: assemblyscript "https://github.com/AssemblyScript/assemblyscript#36040d5b5312f19a025782b5e36663823494c2f3" -"@graphql-typed-document-node/core@^3.1.0": +"@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== +"@hapi/accept@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" + integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + "@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/ammo@5.x.x", "@hapi/ammo@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-5.0.1.tgz#9d34560f5c214eda563d838c01297387efaab490" + integrity sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x", "@hapi/boom@^9.1.0": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.2.tgz#48bd41d67437164a2d636e3b5bc954f8c8dc5e38" + integrity sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bounce@2.x.x", "@hapi/bounce@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-2.0.0.tgz#e6ef56991c366b1e2738b2cd83b01354d938cf3d" + integrity sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + "@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/bourne@2.x.x": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" + integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== + +"@hapi/call@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@hapi/call/-/call-8.0.1.tgz#9e64cd8ba6128eb5be6e432caaa572b1ed8cd7c0" + integrity sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/catbox-memory@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-5.0.1.tgz#cb63fca0ded01d445a2573b38eb2688df67f70ac" + integrity sha512-QWw9nOYJq5PlvChLWV8i6hQHJYfvdqiXdvTupJFh0eqLZ64Xir7mKNi96d5/ZMUAqXPursfNDIDxjFgoEDUqeQ== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/catbox@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-11.1.1.tgz#d277e2d5023fd69cddb33d05b224ea03065fec0c" + integrity sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/podium" "4.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/content@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/content/-/content-5.0.2.tgz#ae57954761de570392763e64cdd75f074176a804" + integrity sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/file@2.x.x": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/file/-/file-2.0.0.tgz#2ecda37d1ae9d3078a67c13b7da86e8c3237dfb9" + integrity sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ== + +"@hapi/hapi@^20.0.0": + version "20.1.3" + resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.1.3.tgz#f4d000e429769d61df59c39cc66dfa252192eff6" + integrity sha512-ImOkrixD1kPUuvmSklwytPQ0sG8AtqydwU0JzvITLE6Z7wPMVf9i9LIMWywKPxHTNhCZ6W3oKP9yRjqM/IkHMQ== + dependencies: + "@hapi/accept" "^5.0.1" + "@hapi/ammo" "^5.0.1" + "@hapi/boom" "^9.1.0" + "@hapi/bounce" "^2.0.0" + "@hapi/call" "^8.0.0" + "@hapi/catbox" "^11.1.1" + "@hapi/catbox-memory" "^5.0.0" + "@hapi/heavy" "^7.0.1" + "@hapi/hoek" "^9.0.4" + "@hapi/mimos" "^6.0.0" + "@hapi/podium" "^4.1.1" + "@hapi/shot" "^5.0.5" + "@hapi/somever" "^3.0.0" + "@hapi/statehood" "^7.0.3" + "@hapi/subtext" "^7.0.3" + "@hapi/teamwork" "^5.1.0" + "@hapi/topo" "^5.0.0" + "@hapi/validate" "^1.1.1" + +"@hapi/heavy@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-7.0.1.tgz#73315ae33b6e7682a0906b7a11e8ca70e3045874" + integrity sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/validate" "1.x.x" + "@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/hoek@9.x.x", "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" + integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== + +"@hapi/inert@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@hapi/inert/-/inert-6.0.3.tgz#57af5d912893fabcb57eb4b956f84f6cd8020fe1" + integrity sha512-Z6Pi0Wsn2pJex5CmBaq+Dky9q40LGzXLUIUFrYpDtReuMkmfy9UuUeYc4064jQ1Xe9uuw7kbwE6Fq6rqKAdjAg== + dependencies: + "@hapi/ammo" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bounce" "2.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/validate" "1.x.x" + lru-cache "^6.0.0" + +"@hapi/iron@6.x.x": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/joi@^15.1.0": version "15.1.1" resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" @@ -1896,6 +2598,89 @@ "@hapi/hoek" "8.x.x" "@hapi/topo" "3.x.x" +"@hapi/mimos@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-6.0.0.tgz#daa523d9c07222c7e8860cb7c9c5501fd6506484" + integrity sha512-Op/67tr1I+JafN3R3XN5DucVSxKRT/Tc+tUszDwENoNpolxeXkhrJ2Czt6B6AAqrespHoivhgZBWYSuANN9QXg== + dependencies: + "@hapi/hoek" "9.x.x" + mime-db "1.x.x" + +"@hapi/nigel@4.x.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-4.0.2.tgz#8f84ef4bca4fb03b2376463578f253b0b8e863c4" + integrity sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw== + dependencies: + "@hapi/hoek" "^9.0.4" + "@hapi/vise" "^4.0.0" + +"@hapi/pez@^5.0.1": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.0.3.tgz#b75446e6fef8cbb16816573ab7da1b0522e7a2a1" + integrity sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/content" "^5.0.2" + "@hapi/hoek" "9.x.x" + "@hapi/nigel" "4.x.x" + +"@hapi/podium@4.x.x", "@hapi/podium@^4.1.1": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" + integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/teamwork" "5.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/shot@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-5.0.5.tgz#a25c23d18973bec93c7969c51bf9579632a5bebd" + integrity sha512-x5AMSZ5+j+Paa8KdfCoKh+klB78otxF+vcJR/IoN91Vo2e5ulXIW6HUsFTCU+4W6P/Etaip9nmdAx2zWDimB2A== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/somever@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-3.0.1.tgz#9961cd5bdbeb5bb1edc0b2acdd0bb424066aadcc" + integrity sha512-4ZTSN3YAHtgpY/M4GOtHUXgi6uZtG9nEZfNI6QrArhK0XN/RDVgijlb9kOmXwCR5VclDSkBul9FBvhSuKXx9+w== + dependencies: + "@hapi/bounce" "2.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/statehood@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.3.tgz#655166f3768344ed3c3b50375a303cdeca8040d9" + integrity sha512-pYB+pyCHkf2Amh67QAXz7e/DN9jcMplIL7Z6N8h0K+ZTy0b404JKPEYkbWHSnDtxLjJB/OtgElxocr2fMH4G7w== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/bounce" "2.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/iron" "6.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/subtext@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.0.3.tgz#f7440fc7c966858e1f39681e99eb6171c71e7abd" + integrity sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/content" "^5.0.2" + "@hapi/file" "2.x.x" + "@hapi/hoek" "9.x.x" + "@hapi/pez" "^5.0.1" + "@hapi/wreck" "17.x.x" + +"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.0.tgz#7801a61fc727f702fd2196ef7625eb4e389f4124" + integrity sha512-llqoQTrAJDTXxG3c4Kz/uzhBS1TsmSBa/XG5SPcVXgmffHE1nFtyLIK0hNJHCB3EuBKT84adzd1hZNY9GJLWtg== + "@hapi/topo@3.x.x": version "3.1.6" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" @@ -1903,6 +2688,37 @@ dependencies: "@hapi/hoek" "^8.3.0" +"@hapi/topo@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" + integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/validate@1.x.x", "@hapi/validate@^1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" + integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + +"@hapi/vise@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-4.0.0.tgz#c6a94fe121b94a53bf99e7489f7fcc74c104db02" + integrity sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/wreck@17.x.x": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.1.0.tgz#fbdc380c6f3fa1f8052dc612b2d3b6ce3e88dbec" + integrity sha512-nx6sFyfqOpJ+EFrHX+XWwJAxs3ju4iHdbB/bwR8yTNZOiYmuhA8eCe7lYPtYmb4j7vyK/SlbaQsmTtUrMvPEBw== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/hoek" "9.x.x" + "@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" @@ -2079,25 +2895,6 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^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" @@ -2109,10 +2906,15 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@josephg/resolvable@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.0.tgz#cd75b09cfad18cd945de9221d403203aa07e3d0a" + integrity sha512-OfTtjoqB2doov5aTJxkyAMK8dXoo7CjCUQSYUEtiY34jbWduOGV7+168tmCT8COMsUEd5DMSFg/0iAOPCBTNAQ== + "@json-rpc-tools/types@^1.6.1": - version "1.6.4" - resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.6.4.tgz#8cfda48bcc19d4f643ff21ff56bdc1dce730a1f6" - integrity sha512-DHtnvlIFN8YUun38Sy9SaRdV/BsUMFM5bAABDsb/iPGLfPHOMKoAyuPOwEqQ2vgtc9ayTcQ2546OPTQ92IzJ/g== + version "1.7.3" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.3.tgz#ee7185314ecb815bfd486bbc15a86ab2f5b86680" + integrity sha512-wCv2e3bRNI309J5ATch0sPo3SKYoXDqyygsWtIUXOnv2pb0gzZVfj0lDbXVvdIDch2EUKPjY/8KyCA+lhFn7Jw== dependencies: keyvaluestorage-interface "^1.0.0" @@ -2808,11 +3610,111 @@ npmlog "^4.1.2" write-file-atomic "^2.3.0" -"@metamask/safe-event-emitter@^2.0.0": +"@material-ui/core@^4.11.3": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.4.tgz#4fb9fe5dec5dcf780b687e3a40cff78b2b9640a4" + integrity sha512-oqb+lJ2Dl9HXI9orc6/aN8ZIAMkeThufA5iZELf2LQeBn2NtjVilF5D2w7e9RpntAzDb4jK5DsVhkfOvFY/8fg== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.11.3" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/pickers@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@material-ui/pickers/-/pickers-3.3.10.tgz#f1b0f963348cc191645ef0bdeff7a67c6aa25485" + integrity sha512-hS4pxwn1ZGXVkmgD4tpFpaumUaAg2ZzbTrxltfC5yPw4BJV+mGkfnQOB4VpWEYZw2jv65Z0wLwDE/piQiPPZ3w== + dependencies: + "@babel/runtime" "^7.6.0" + "@date-io/core" "1.x" + "@types/styled-jsx" "^2.2.8" + clsx "^1.0.2" + react-transition-group "^4.0.0" + rifm "^0.7.0" + +"@material-ui/styles@^4.11.4": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d" + integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.11.3.tgz#466bc14c9986798fd325665927c963eb47cc4143" + integrity sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@metamask/detect-provider@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@metamask/detect-provider/-/detect-provider-1.2.0.tgz#3667a7531f2a682e3c3a43eaf3a1958bdb42a696" + integrity sha512-ocA76vt+8D0thgXZ7LxFPyqw3H7988qblgzddTDA6B8a/yU0uKV42QR/DhA+Jh11rJjxW0jKvwb5htA6krNZDQ== + +"@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== +"@motrix/nat-api@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@motrix/nat-api/-/nat-api-0.3.1.tgz#de18e7101cc6ed82e9e1e7b5720cb2b40f490246" + integrity sha512-mUsW8BlSK4bE5kjC5H4oQPjnXXuiRtE2V26tzW/AOroXl5CuhMEr9EDrr+wUFvDHlDwK4B0uSOBa8yILr6AfbQ== + dependencies: + async "^3.2.0" + debug "^4.1.1" + default-gateway "^6.0.1" + request "^2.88.2" + unordered-array-remove "^1.0.2" + xml2js "^0.4.23" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2852,36 +3754,15 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@nomiclabs/ethereumjs-vm@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc" - integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q== - 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 "3.0.0" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - util.promisify "^1.0.0" - "@nomiclabs/hardhat-ethers@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.1.tgz#f86a6fa210dbe6270adffccc75e93ed60a856904" - integrity sha512-uTFHDhhvJ+UjfvvMeQxD3ZALuzuI3FXzTYT1Z5N3ebyZL5z4Ogwt55GB0R9tdKY0p5HhDhBjU/gsCjUEwIVoaw== + 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.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.1.tgz#186f3fa652a0ca20fb77aa857cfad2da845d5cbf" - integrity sha512-8TNUFsO5DpAfwNlXMDhcEtFAMOYsVNaQL2vq5vuCD45kUKBgL8H21++zOk231ha9D7LQWBMCIg7A7iPxw6Jwmg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.2.tgz#333b70a6116e922d16de2ef833dcb7191319afdd" + integrity sha512-SExzaBuHlnmHw0HKkElHITzdvhUQmlIRc2tlaywzgvPbh7WoI24nYqZ4N0CO+JXSDgRpFycvQNA8zRaCqjuqUg== dependencies: "@ethersproject/abi" "^5.0.2" "@ethersproject/address" "^5.0.2" @@ -2923,10 +3804,10 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.3.0.tgz#29e3faa119da90082dc653ea74c8bb345d197bf7" - integrity sha512-5q2qBz4iZ0xS/DEJ0ROusFbN4cVlbJE9GvOByen+mv7artuGXfVhONqcuRd7jYN2glTmCnzcZw+X6LrjRVqs0A== +"@octokit/openapi-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.0.0.tgz#0f6992db9854af15eca77d71ab0ec7fad2f20411" + integrity sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -2972,17 +3853,15 @@ once "^1.4.0" "@octokit/request@^5.2.0": - version "5.4.14" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96" - integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA== + version "5.4.15" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" + integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" "@octokit/types" "^6.7.1" - deprecation "^2.0.0" is-plain-object "^5.0.0" node-fetch "^2.6.1" - once "^1.4.0" universal-user-agent "^6.0.0" "@octokit/rest@^16.28.4": @@ -3015,17 +3894,22 @@ "@types/node" ">= 8" "@octokit/types@^6.0.3", "@octokit/types@^6.7.1": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.12.0.tgz#8376fd60edfd5d1eebfeedb994c6bcb5b862c7a1" - integrity sha512-KwOf16soD7aDEEi/PgNeJlHzjZPfrmmNy+7WezSdrpnqZ7YImBJcNnX9+5RUHt1MnA4h8oISRHTqaZDGsX9DRQ== + version "6.14.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.14.2.tgz#64c9457f38fb8522bdbba3c8cc814590a2d61bf5" + integrity sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA== dependencies: - "@octokit/openapi-types" "^5.3.0" + "@octokit/openapi-types" "^7.0.0" -"@openzeppelin/contracts@^3.2.0": +"@openzeppelin/contracts@^3.1.0", "@openzeppelin/contracts@^3.2.0": version "3.4.1" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1.tgz#03c891fec7f93be0ae44ed74e57a122a38732ce7" integrity sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ== +"@pedrouid/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" + integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== + "@pedrouid/iso-crypto@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@pedrouid/iso-crypto/-/iso-crypto-1.1.0.tgz#3fb4050ea99f2f8ee41ba8661193c0989c815c95" @@ -3037,17 +3921,18 @@ hash.js "^1.1.7" "@pedrouid/iso-random@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pedrouid/iso-random/-/iso-random-1.1.0.tgz#4b9561670fcb31a45e8520852f1bfac34316b111" - integrity sha512-U8P2qdbvyU5aom0036dkpp0C9c8pgW1SNhAo8+zPDzgmKA58Hl6dc+ZkQXkE9aHrzN6v/0w+409JMjSYwx5tVw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@pedrouid/iso-random/-/iso-random-1.2.1.tgz#55178d9a2e7897b0f630dd1b4be76bc8460242d7" + integrity sha512-C35NqYMmLsg61WDiEup4OwjRhgfZIcK4BL+Qg49xowHUJ+f7/LFZCO+TGuQqoXFAj1beKIOpUN33f0fqV7zneQ== dependencies: + "@pedrouid/environment" "^1.0.1" enc-utils "^3.0.0" randombytes "^2.1.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== +"@pmmmwh/react-refresh-webpack-plugin@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" + integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== dependencies: ansi-html "^0.0.7" error-stack-parser "^2.0.6" @@ -3184,6 +4069,19 @@ path-browserify "^1.0.0" url "^0.11.0" +"@rollup/plugin-commonjs@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-18.0.0.tgz#50dc7518b5aa9e66a270e529ea85115d269825c4" + integrity sha512-fj92shhg8luw7XbA0HowAqz90oo7qtLGwqTKbyZ8pmOyH8ui5e+u0wPEgeHLH3djcVma6gUCUrjY6w5R2o1u6g== + 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-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" @@ -3196,9 +4094,9 @@ resolve "^1.14.2" "@rollup/plugin-replace@^2.3.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz#c411b5ab72809fb1bfc8b487d8d02eef661460d3" - integrity sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ== + 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" @@ -3280,39 +4178,60 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sheerun/mutationobserver-shim@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" - integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== - "@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.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" - integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + 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": +"@sinonjs/fake-timers@^6.0.0", "@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.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.0.5.tgz#558a7f8145a01366c44b3dcbdd7172c05c461564" + integrity sha512-fUt6b15bjV/VW93UP5opNXJxdwZSbK1EdiwnhN7XrQrcpaOhMJpZ/CjwFpM3THpxwA+YviBUJKSuEqKlCK5alw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "@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.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.12.0.tgz#18a0fb2a9d2484b23176f63b16093c64794fc323" - integrity sha512-DT3f/Aa4tQysZwUsuqBwvr8YRJzKkvPUKV/9o2/o5EVw3xqlbzmtx4O60lTUcZdCawL+N8bBLNUyOGpHjGlJVQ== + 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== + +"@sovpro/delimited-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sovpro/delimited-stream/-/delimited-stream-1.1.0.tgz#4334bba7ee241036e580fdd99c019377630d26b4" + integrity sha512-kQpk267uxB19X3X2T1mvNMjyvIEonpNSHrMlK5ZaBU6aZxw7wPbpgKJOjHN3+/GPVpXgAV9soVT2oyHpLkLtyw== "@surma/rollup-plugin-off-main-thread@^1.1.1": version "1.4.2" @@ -3376,7 +4295,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" "@svgr/babel-plugin-transform-svg-component" "^5.5.0" -"@svgr/core@^5.4.0": +"@svgr/core@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== @@ -3392,7 +4311,7 @@ dependencies: "@babel/types" "^7.12.6" -"@svgr/plugin-jsx@^5.4.0", "@svgr/plugin-jsx@^5.5.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== @@ -3402,7 +4321,7 @@ "@svgr/hast-util-to-babel-ast" "^5.5.0" svg-parser "^2.0.2" -"@svgr/plugin-svgo@^5.4.0": +"@svgr/plugin-svgo@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== @@ -3411,18 +4330,18 @@ 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" +"@svgr/webpack@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" "@szmarczak/http-timer@^1.1.2": @@ -3432,10 +4351,10 @@ dependencies: defer-to-connect "^1.0.1" -"@testing-library/dom@*": - version "7.29.6" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.29.6.tgz#eb37844fb431186db7960a7ff6749ea65a19617c" - integrity sha512-vzTsAXa439ptdvav/4lsKRcGpAQX7b6wBIqia7+iNzqGJ5zjswApxA6jDAsexrc6ue9krWcbh8o+LYkBXW+GCQ== +"@testing-library/dom@^7.28.1": + version "7.30.4" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.30.4.tgz#c6a4a91557e92035fd565246bbbfb8107aa4634d" + integrity sha512-GObDVMaI4ARrZEXaRy4moolNAxWPKvEYNV/fa6Uc2eAzR/t4otS6A7EhrntPBIQLeehL9DbVhscvvv7gd6hWqA== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -3446,52 +4365,44 @@ lz-string "^1.4.4" pretty-format "^26.6.2" -"@testing-library/dom@^6.15.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.16.0.tgz#04ada27ed74ad4c0f0d984a1245bb29b1fd90ba9" - integrity sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA== +"@testing-library/jest-dom@^5.11.4": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.12.0.tgz#6a5d340b092c44b7bce17a4791b47d9bc2c61443" + integrity sha512-N9Y82b2Z3j6wzIoAqajlKVF1Zt7sOH0pPee0sUHXHc5cv2Fdn23r+vpWm0MBBoGJtPOly5+Bdx1lnc3CD+A+ow== dependencies: - "@babel/runtime" "^7.8.4" - "@sheerun/mutationobserver-shim" "^0.3.2" - "@types/testing-library__dom" "^6.12.1" - aria-query "^4.0.2" - dom-accessibility-api "^0.3.0" - pretty-format "^25.1.0" - wait-for-expect "^3.0.2" - -"@testing-library/jest-dom@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" - integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== - dependencies: - "@babel/runtime" "^7.5.1" - chalk "^2.4.1" - css "^2.2.3" + "@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" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" + lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^9.3.2": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" - integrity sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg== +"@testing-library/react@^11.1.0": + version "11.2.6" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b" + integrity sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ== dependencies: - "@babel/runtime" "^7.8.4" - "@testing-library/dom" "^6.15.0" - "@types/testing-library__react" "^9.1.2" + "@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" -"@testing-library/user-event@^7.1.2": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" - integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== +"@tokenizer/token@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3" + integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w== "@toruslabs/eccrypto@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.5.tgz#c4b9319e02e913fecd90f3f2b98ae2699e7d498e" - integrity sha512-7sSAQ9M6b9wzxpIE98yi8zPh3wgdYiVBxvMvCOCb4c65UDOT6lpZyH30qP2fX30PaI+I2Ra+FwjfCCUuJegxfQ== + version "1.1.6" + resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.6.tgz#ce877cf00d6f9cf7ab3daa6ac4d6d540110b813b" + integrity sha512-L3TAsdEARouyzTbSKE0PqcYXmHQiFh95FB2YnsRbWERCAF0VWg3kY/YA//M/HBZqCJoRwa5WRA61lWbM7zAX5Q== dependencies: acorn "^7.4.0" elliptic "^6.5.3" @@ -3516,9 +4427,9 @@ deepmerge "^4.2.2" "@toruslabs/torus-embed@^1.8.0": - version "1.9.10" - resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.9.10.tgz#0d4a881153c42ef65db6d99aa40dfcdb0faa566f" - integrity sha512-IPu+O0jMcBD4GvSUbReon+arp2MQGs3IGHP0ZJ7kYIlwSLwWTEFLtCc35zUFVkp8O/hhoa5A27Omq+d1F/ORdA== + version "1.10.10" + resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.10.10.tgz#478feaafa7b6cdcff8d48513e2696fec26ae8a95" + integrity sha512-RlJYk0mZHq1bR/F0G5tu8vrYNK2lUr7hMG91BX3vF10HsdmCRntbAsHAkUssdyVE6ZCBE1iYYgP4bTlP8gzc3w== dependencies: "@chaitanyapotti/random-id" "^1.0.3" "@toruslabs/fetch-node-details" "^2.4.0" @@ -3526,7 +4437,7 @@ "@toruslabs/torus.js" "^2.3.0" create-hash "^1.2.0" deepmerge "^4.2.2" - eth-rpc-errors "^4.0.2" + eth-rpc-errors "^4.0.3" fast-deep-equal "^3.1.3" is-stream "^2.0.0" json-rpc-engine "^6.1.0" @@ -3552,29 +4463,28 @@ memory-cache "^0.2.0" web3-utils "^1.3.3" -"@truffle/error@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.12.tgz#83e02e6ffe1d154fe274141d90038a91fd1e186d" - integrity sha512-kZqqnPR9YDJG7KCDOcN1qH16Qs0oz1PzF0Y93AWdhXuL9S9HYo/RUUeqGKbPpRBEZldQUS8aa4EzfK08u5pu6g== +"@truffle/error@^0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.13.tgz#d2d8b9be8ed8c876e1a63f64d1ebe74f9827a08c" + integrity sha512-tzB2Kt9QSMK0He86ZFYhNyew9V6vZ7FboqmCFL5YyQd/P2mY14PJIw92NdkcTGxn1GNe+oYoHBS0Eu1c7DhC5Q== -"@truffle/interface-adapter@^0.4.19": - version "0.4.19" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.19.tgz#19248ac88099f8df34f58a3d43a95ba3470dc89a" - integrity sha512-+Zz6Fr8+I2wYSS8RM3WBOMzf22QffMQTnlsYsRgRHzv3gYoRA9ZDLb84lFRfmWyw+IdXTo90tjRHEb5krC6uxg== +"@truffle/interface-adapter@^0.4.22": + version "0.4.22" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.22.tgz#cd77c3acf2d5b1bf3ca8caab5784d61d3ba18dcf" + integrity sha512-G5uLkXUv/1Cp4090hEGX9Y96FwUuLvsZloZu/cF3ltK/oj0ltNPMxt009v5ptFu3jH1c2IwLvxtvvL0Y+pI8GQ== dependencies: bn.js "^5.1.3" ethers "^4.0.32" - source-map-support "^0.5.19" - web3 "1.2.9" + web3 "1.3.5" "@truffle/provider@^0.2.24": - version "0.2.26" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.26.tgz#88e31b79973c2427c4a17d9a59411e6fbc810190" - integrity sha512-YKPmhB9S9AQkT2ePGtadwjDduxU23DXXy+5zyM5fevw5GCbXSnf+jG6rICXjPkVFjuKBlXuq5JbuERZn43522Q== + version "0.2.29" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.29.tgz#c10becacb2a970ed73c19296d166667b5079945e" + integrity sha512-hZs9pWjPHsQ1HPROYf5N9pnLMPsDeLYUaDCO/D8sO4mjE+u3ZfUf2scIfNh7/BP76WQDXO7GzzV8CDLS8Zln3Q== dependencies: - "@truffle/error" "^0.0.12" - "@truffle/interface-adapter" "^0.4.19" - web3 "1.2.9" + "@truffle/error" "^0.0.13" + "@truffle/interface-adapter" "^0.4.22" + web3 "1.3.5" "@typechain/ethers-v5@^2.0.0": version "2.0.0" @@ -3588,6 +4498,11 @@ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-4.0.0.tgz#2a8be5e108d23f3b8e6354d1618fdc2abcb00b07" integrity sha512-Rw4WHPIuwTXWcHfmn9ICQISQhmJa6Ug5IjqPYLpsKqlED2L4W2JgQ6S9hYt4IKVmT//1yxIxD+iaa5tSQEEx1A== +"@types/abstract-leveldown@*": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e" + integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ== + "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -3606,9 +4521,9 @@ integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -3632,12 +4547,19 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" - integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + version "7.11.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" + integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== dependencies: "@babel/types" "^7.3.0" +"@types/bl@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@types/bl/-/bl-4.1.0.tgz#fadef609edc9be15e7941aa61bf309df3dc9b135" + integrity sha512-fLthIdXgivtEy4kQ1MY6qzpqE5YJdJ4KjI5TEaLLqyCwt9IGVVY5WTx19uikJQOMERflIiGT75nkwB7CixBfXg== + dependencies: + "@types/node" "*" + "@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" @@ -3645,7 +4567,7 @@ dependencies: "@types/node" "*" -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5": +"@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== @@ -3661,9 +4583,9 @@ "@types/node" "*" "@types/chai@*", "@types/chai@^4.2.13", "@types/chai@^4.2.14": - version "4.2.15" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" - integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== + version "4.2.17" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.17.tgz#85f9f0610f514b22a94125d441f73eef65bde5cc" + integrity sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA== "@types/chalk@^2.2.0": version "2.2.0" @@ -3672,6 +4594,11 @@ dependencies: chalk "*" +"@types/component-emitter@^1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" + integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== + "@types/connect@*", "@types/connect@^3.4.33": version "3.4.34" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" @@ -3684,6 +4611,11 @@ resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== +"@types/cookie@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108" + integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg== + "@types/cookies@*": version "0.7.6" resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504" @@ -3694,41 +4626,44 @@ "@types/keygrip" "*" "@types/node" "*" -"@types/cors@2.8.8": - version "2.8.8" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.8.tgz#317a8d8561995c60e35b9e0fcaa8d36660c98092" - integrity sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w== - dependencies: - "@types/express" "*" +"@types/cors@2.8.10", "@types/cors@^2.8.8": + version "2.8.10" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" + integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== + +"@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== "@types/eslint@^7.2.6": - version "7.2.6" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" - integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== + version "7.2.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.10.tgz#4b7a9368d46c0f8cd5408c23288a59aa2394d917" + integrity sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@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@*", "@types/express-serve-static-core@4.17.18", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.9": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz#8371e260f40e0e1ca0c116a9afcd9426fa094c40" - integrity sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA== +"@types/express-serve-static-core@4.17.19", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.9": + version "4.17.19" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" + integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@^4.17.8": +"@types/express@*", "@types/express@4.17.11", "@types/express@^4.17.8": version "4.17.11" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== @@ -3738,16 +4673,6 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/express@4.17.7": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" - integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "*" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/fs-capacitor@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" @@ -3810,14 +4735,6 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/istanbul-reports@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" @@ -3825,10 +4742,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.14", "@types/jest@^26.0.15": - version "26.0.20" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.20.tgz#cd2f2702ecf69e86b586e1f5223a60e454056307" - integrity sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA== +"@types/jest@*", "@types/jest@^26.0.15": + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -3869,12 +4786,20 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/levelup@^4.3.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.1.tgz#7a53b9fd510716e11b2065332790fdf5f9b950b9" + integrity sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A== + dependencies: + "@types/abstract-leveldown" "*" + "@types/node" "*" + "@types/lodash@*", "@types/lodash@^4.14.159": version "4.14.168" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== -"@types/long@^4.0.0": +"@types/long@^4.0.0", "@types/long@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== @@ -3897,9 +4822,9 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== "@types/minimist@^1.2.0": version "1.2.1" @@ -3914,40 +4839,42 @@ "@types/node" "*" "@types/mocha@^8.0.3": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.1.tgz#f3f3ae4590c5386fc7c543aae9b78d4cf30ffee9" - integrity sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ== + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== -"@types/node-fetch@2.5.7": - version "2.5.7" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" - integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== +"@types/node-fetch@^2.5.10", "@types/node-fetch@^2.5.5": + version "2.5.10" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" + integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== dependencies: "@types/node" "*" form-data "^3.0.0" -"@types/node-fetch@^2.5.5": - version "2.5.8" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" - integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" +"@types/node@*", "@types/node@>= 8", "@types/node@>=13.7.0": + version "15.0.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" + integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== + +"@types/node@>=10.0.0": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.3.tgz#ee09fcaac513576474c327da5818d421b98db88a" + integrity sha512-/WbxFeBU+0F79z9RdEOXH4CsDga+ibi5M8uEYr91u3CkT/pdWcV8MCook+4wDPnZBexRdwWS+PiVZ2xJviAzcQ== -"@types/node@*", "@types/node@>= 8", "@types/node@^14.11.2", "@types/node@^14.11.8", "@types/node@^14.14.6": - version "14.14.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" - integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== +"@types/node@^10.1.0", "@types/node@^10.3.2": + version "10.17.59" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.59.tgz#03f440ccf746a27f7da6e141e6cbae64681dbd2f" + integrity sha512-7Uc8IRrL8yZz5ti45RaFxpbU8TxlzdC3HvxV+hOWo1EyLsuKv/w7y0n+TwZzwL3vdx3oZ2k3ubxPq131hNtXyg== -"@types/node@^10.1.0", "@types/node@^10.12.18", "@types/node@^10.3.2": - version "10.17.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.54.tgz#a737488631aca3ec7bd9f6229d77f1079e444793" - integrity sha512-c8Lm7+hXdSPmWH4B9z/P/xIXhFK3mCQin4yCYMd2p1qpMG5AfgyJuYZ+3q2dT7qLiMMMGMd5dnkFpdqJARlvtQ== +"@types/node@^12.0.0", "@types/node@^12.12.54", "@types/node@^12.12.6": + version "12.20.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.11.tgz#980832cd56efafff8c18aa148c4085eb02a483f4" + integrity sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ== -"@types/node@^12.12.54", "@types/node@^12.12.6", "@types/node@^12.6.1": - version "12.20.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.4.tgz#73687043dd00fcb6962c60fbf499553a24d6bdf2" - integrity sha512-xRCgeE0Q4pT5UZ189TJ3SpYuX/QGl6QIAOAIeDSbAVAd2gX1NxSZup4jNVK7cxIeP8KDSbJgcckun495isP1jQ== +"@types/node@^14.11.8", "@types/node@^14.14.6": + version "14.14.43" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" + integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -3967,9 +4894,9 @@ "@types/node" "*" "@types/prettier@^2.0.0", "@types/prettier@^2.1.1": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.2.tgz#e2280c89ddcbeef340099d6968d8c86ba155fdf6" - integrity sha512-i99hy7Ki19EqVOl77WplDrvgNugHnsSjECVR/wUrzw2TJXz1zlUfT2ngGckR6xN7yFYaijsMAqPkOLx9HgUqHg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" + integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== "@types/prop-types@*": version "15.7.3" @@ -3982,30 +4909,23 @@ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/qs@*", "@types/qs@^6.9.4": - version "6.9.5" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" - integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" + integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/react-dom@*": - version "17.0.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.1.tgz#d92d77d020bfb083e07cc8e0ac9f933599a4d56a" - integrity sha512-yIVyopxQb8IDZ7SOHeTovurFq+fXiPICa+GV3gp0Xedsl+MwQlMLKmvrnEjFbQxjliH5YVAEWFh975eVNmKj7Q== +"@types/react-dom@^17.0.0": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.3.tgz#7fdf37b8af9d6d40127137865bb3fff8871d7ee1" + integrity sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w== dependencies: "@types/react" "*" -"@types/react-dom@^16.9.8": - version "16.9.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.11.tgz#752e223a1592a2c10f2668b215a0e0667f4faab1" - integrity sha512-3UuR4MoWf5spNgrG6cwsmT9DdRghcR4IDFOzNZ6+wcmacxkFykcb5ji0nNVm9ckBT4BCxvCrJJbM4+EYsEEVIg== - dependencies: - "@types/react" "^16" - -"@types/react-router-dom@^5.1.5": +"@types/react-router-dom@^5.1.7": version "5.1.7" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.7.tgz#a126d9ea76079ffbbdb0d9225073eb5797ab7271" integrity sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg== @@ -4014,30 +4934,38 @@ "@types/react" "*" "@types/react-router" "*" -"@types/react-router@*": - version "5.1.12" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.12.tgz#0f300e09468e7aed86e18241c90238c18c377e51" - integrity sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA== +"@types/react-router@*", "@types/react-router@^5.1.12": + version "5.1.13" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.13.tgz#051c0d229bd48ad90558a1db500708127cc512f7" + integrity sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg== dependencies: "@types/history" "*" "@types/react" "*" -"@types/react@*": - version "17.0.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" - integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== +"@types/react-transition-group@^4.2.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" + integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" + "@types/react" "*" -"@types/react@^16", "@types/react@^16.9.49": - version "16.14.4" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.4.tgz#365f6a1e117d1eec960ba792c7e1e91ecad38e6f" - integrity sha512-ETj7GbkPGjca/A4trkVeGvoIakmLV6ZtX3J8dcmOpzKzWVybbrOxanwaIPG71GZwImoMDY6Fq4wIe34lEqZ0FQ== +"@types/react@*", "@types/react@^17.0.0": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.4.tgz#a67c6f7a460d2660e950d9ccc1c2f18525c28220" + integrity sha512-onz2BqScSFMoTRdJUZUDD/7xrusM8hBA2Fktk2qgaTYPCgPvWnDEgkrOs8hhPUf2jfcIXkJ5yK6VfYormJS3Jw== dependencies: "@types/prop-types" "*" + "@types/scheduler" "*" csstype "^3.0.2" +"@types/readable-stream@^2.3.9": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.10.tgz#0f1a512ca30bec5e53d3282133b9237a703e7562" + integrity sha512-xwSXvAv9x4B9Vj88AMZnFyEVLilz1EBxKvRUhGqIF4nJpRQBSTm7jS236X4Y9Y2qPsVvaMxwrGJlNhLHEahlFQ== + dependencies: + "@types/node" "*" + safe-buffer "*" + "@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" @@ -4045,10 +4973,20 @@ dependencies: "@types/node" "*" +"@types/retry@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" + integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + "@types/secp256k1@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" - integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d" + integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A== dependencies: "@types/node" "*" @@ -4069,16 +5007,11 @@ "@types/sinon" "*" "@types/sinon@*": - version "9.0.10" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.10.tgz#7fb9bcb6794262482859cab66d59132fca18fcf7" - integrity sha512-/faDC0erR06wMdybwI/uR8wEKV/E83T0k4sepIpB7gXuy2gzx2xiOjmztq6a2Y6rIGJ04D+6UU0VBmWy+4HEMA== + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" + integrity sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ== dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" - integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== + "@sinonjs/fake-timers" "^7.0.4" "@types/source-list-map@*": version "0.1.2" @@ -4100,54 +5033,45 @@ resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== -"@types/styled-components@^5.1.3": - version "5.1.7" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.7.tgz#3cd10b088c1cb1acde2e4b166b3e8275a3083710" - integrity sha512-BJzPhFygYspyefAGFZTZ/8lCEY4Tk+Iqktvnko3xmJf9LrLqs3+grxPeU3O0zLl6yjbYBopD0/VikbHgXDbJtA== +"@types/styled-components@^5.1.7": + version "5.1.9" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.9.tgz#00d3d84b501420521c4db727e3c195459f87a6cf" + integrity sha512-kbEG6YlwK8rucITpKEr6pA4Ho9KSQHUUOzZ9lY3va1mtcjvS3D0wDciFyHEiNHKLL/npZCKDQJqm0x44sPO9oA== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" csstype "^3.0.2" -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== - -"@types/testing-library__dom@*": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz#e0a00dd766983b1d6e9d10d33e708005ce6ad13e" - integrity sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g== +"@types/styled-jsx@^2.2.8": + version "2.2.8" + resolved "https://registry.yarnpkg.com/@types/styled-jsx/-/styled-jsx-2.2.8.tgz#b50d13d8a3c34036282d65194554cf186bab7234" + integrity sha512-Yjye9VwMdYeXfS71ihueWRSxrruuXTwKCbzue4+5b2rjnQ//AtyM7myZ1BEhNhBQ/nL/RE7bdToUoLln2miKvg== dependencies: - "@testing-library/dom" "*" + "@types/react" "*" -"@types/testing-library__dom@^6.12.1": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz#1aede831cb4ed4a398448df5a2c54b54a365644e" - integrity sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA== - dependencies: - pretty-format "^24.3.0" +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" + integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== -"@types/testing-library__react@^9.1.2": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" - integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== +"@types/testing-library__jest-dom@^5.9.1": + version "5.9.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0" + integrity sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ== dependencies: - "@types/react-dom" "*" - "@types/testing-library__dom" "*" - pretty-format "^25.1.0" + "@types/jest" "*" "@types/uglify-js@*": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.12.0.tgz#2bb061c269441620d46b946350c8f16d52ef37c5" - integrity sha512-sYAF+CF9XZ5cvEBkI7RtrG9g2GtMBkviTnBxYYyq+8BWvO4QtXfwwR6a2LFwCi4evMKZfpv6U43ViYvv17Wz3Q== + version "3.13.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" + integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q== dependencies: source-map "^0.6.1" "@types/underscore@*": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.0.tgz#bb33549f8f89957fdf959c16e4c1d0eaa5bf985d" - integrity sha512-ipNAQLgRnG0EWN1cTtfdVHp5AyTW/PAMJ1PxLN4bAKSHbusSZbj48mIHiydQpN7GgQrYqwfnvZ573OVfJm5Nzg== + version "1.11.2" + resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3" + integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w== "@types/web3@1.0.19": version "1.0.19" @@ -4167,21 +5091,21 @@ source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.26" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" - integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== + version "4.41.27" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.27.tgz#f47da488c8037e7f1b2dbf2714fbbacb61ec0ffc" + integrity sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA== dependencies: "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "*" + "@types/tapable" "^1" "@types/uglify-js" "*" "@types/webpack-sources" "*" source-map "^0.6.0" "@types/ws@^7.0.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" - integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.2.tgz#bfe739b5f8b3a39742605fbe415ae7e88ee614c8" + integrity sha512-PbeN0Eydl7LQl4OIav29YmkO2LxbVuz3nZD/kb19lOS+wLgIkRbWMNmU/QQR7ABpOJ7D7xDOU8co7iohObewrw== dependencies: "@types/node" "*" @@ -4190,13 +5114,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== -"@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^15.0.0": version "15.0.13" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" @@ -4204,13 +5121,18 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.5.0", "@typescript-eslint/eslint-plugin@^4.9.0": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz#2caf6a79dd19c3853b8d39769a27fccb24e4e651" - integrity sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ== +"@types/zen-observable@^0.8.0": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" + integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== + +"@typescript-eslint/eslint-plugin@^4.19.0", "@typescript-eslint/eslint-plugin@^4.5.0": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.1.tgz#6bcdbaa4548553ab861b4e5f34936ead1349a543" + integrity sha512-kVTAghWDDhsvQ602tHBc6WmQkdaYbkcTwZu+7l24jtJiYvm9l+/y/b2BZANEezxPDiX5MK2ZecE+9BFi/YJryw== dependencies: - "@typescript-eslint/experimental-utils" "4.16.1" - "@typescript-eslint/scope-manager" "4.16.1" + "@typescript-eslint/experimental-utils" "4.22.1" + "@typescript-eslint/scope-manager" "4.22.1" debug "^4.1.1" functional-red-black-tree "^1.0.1" lodash "^4.17.15" @@ -4218,25 +5140,15 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.16.1", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz#da7a396dc7d0e01922acf102b76efff17320b328" - integrity sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.16.1" - "@typescript-eslint/types" "4.16.1" - "@typescript-eslint/typescript-estree" "4.16.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@^2.5.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@4.22.1", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.1.tgz#3938a5c89b27dc9a39b5de63a62ab1623ab27497" + integrity sha512-svYlHecSMCQGDO2qN1v477ax/IDQwWhc7PRBiwAdAMJE7GXk5stF4Z9R/8wbRkuX/5e9dHqbIWxjeOjckK3wLQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -4251,46 +5163,33 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.5.0", "@typescript-eslint/parser@^4.9.0": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.16.1.tgz#3bbd3234dd3c5b882b2bcd9899bc30e1e1586d2a" - integrity sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg== +"@typescript-eslint/parser@^4.19.0", "@typescript-eslint/parser@^4.5.0": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.1.tgz#a95bda0fd01d994a15fc3e99dc984294f25c19cc" + integrity sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw== dependencies: - "@typescript-eslint/scope-manager" "4.16.1" - "@typescript-eslint/types" "4.16.1" - "@typescript-eslint/typescript-estree" "4.16.1" + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.16.1": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz#244e2006bc60cfe46987e9987f4ff49c9e3f00d5" - integrity sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw== +"@typescript-eslint/scope-manager@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz#5bb357f94f9cd8b94e6be43dd637eb73b8f355b4" + integrity sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g== dependencies: - "@typescript-eslint/types" "4.16.1" - "@typescript-eslint/visitor-keys" "4.16.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" "@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.16.1": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.16.1.tgz#5ba2d3e38b1a67420d2487519e193163054d9c15" - integrity sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA== - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.1.tgz#bf99c6cec0b4a23d53a61894816927f2adad856a" + integrity sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -4306,13 +5205,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.16.1": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz#c2fc46b05a48fbf8bbe8b66a63f0a9ba04b356f1" - integrity sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg== +"@typescript-eslint/typescript-estree@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz#dca379eead8cdfd4edc04805e83af6d148c164f9" + integrity sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A== dependencies: - "@typescript-eslint/types" "4.16.1" - "@typescript-eslint/visitor-keys" "4.16.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" @@ -4326,12 +5225,12 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@typescript-eslint/visitor-keys@4.16.1": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz#d7571fb580749fae621520deeb134370bbfc7293" - integrity sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w== +"@typescript-eslint/visitor-keys@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz#6045ae25a11662c671f90b3a403d682dfca0b7a6" + integrity sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ== dependencies: - "@typescript-eslint/types" "4.16.1" + "@typescript-eslint/types" "4.22.1" eslint-visitor-keys "^2.0.0" "@urql/core@^1.13.1": @@ -4342,100 +5241,123 @@ "@graphql-typed-document-node/core" "^3.1.0" wonka "^4.0.14" -"@walletconnect/client@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.3.6.tgz#537b7af6bf87a906fcf171fd5bc4e56a2a3d1908" - integrity sha512-HmzUpF/cPqPf8huaVg45SXk2hKQ6yxisy/qJ+51SoRGmtZDokJGxpq6+RFOnE8jFtUhTZRaK9UZ/jvsJAxIhEw== +"@vascosantos/moving-average@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vascosantos/moving-average/-/moving-average-1.1.0.tgz#8d5793b09b2d6021ba5e620c6a0f876c20db7eaa" + integrity sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w== + +"@vocdoni/storage-proofs-eth@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@vocdoni/storage-proofs-eth/-/storage-proofs-eth-0.3.2.tgz#ae440f79fc039adf7239b5f48762f5c6d759377a" + integrity sha512-ThLPWYlN8SysTMuYl5R0FPZq++5LDHhaxJ6tNIhMD7TukU9OeKb8wdzeScCroKI9/XhWycZ4aeDtPGISe1TsYA== dependencies: - "@walletconnect/core" "^1.3.6" - "@walletconnect/iso-crypto" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@ethereumjs/block" "^3.4.0" + "@ethereumjs/common" "^2.4.0" + ethers "^5.4.1" + merkle-patricia-tree "^4.2.0" -"@walletconnect/core@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.3.6.tgz#1690081bc4666b6644ed6a1bed128509a5259e50" - integrity sha512-1HHP2xZI6b88WQgszs3gP5xkkCwwlWgDJz+J6ADGzVXhQP21p1mZhKezUtx27rOtQimMIrPDfgPyAHwQBZkkSw== +"@walletconnect/browser-utils@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.4.1.tgz#a8d5a038d28c19b739eb0ff4194ced140c922d36" + integrity sha512-ONrkPSI/27o1Wj8kUwE0uUZFk0GDCDQBJy614GsrhcwuQwJEW/B+nXPQ+Ca/4WvQySM5hWVHp1gO1kozSUkh3A== dependencies: - "@walletconnect/socket-transport" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/types" "^1.4.1" + detect-browser "5.2.0" + safe-json-utils "1.0.0" + window-getters "1.0.0" + window-metadata "1.0.0" -"@walletconnect/http-connection@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.3.6.tgz#98be28c312cfcca86b962b5a3a2813ac7b3f4866" - integrity sha512-uK9Z8JP7dxo59t9gIQqcAfiuhlpl4fQFh6gRvP8V7sjrEfxqN/GkJaTVzbE6VaYivrSaVeut65wcBOJS47R8Aw== +"@walletconnect/client@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.4.1.tgz#c9c50df5afde23a35e23d96fe6d207c102e53850" + integrity sha512-JRW+9+j9LwszY76/WcIumEiLmhX7eidorH9SFFmI2pFfbrhB6KLe87FaA106kxwZUyWKOLZ6jVV4d1urYSdEwA== + dependencies: + "@walletconnect/core" "^1.4.1" + "@walletconnect/iso-crypto" "^1.4.1" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" + +"@walletconnect/core@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.4.1.tgz#68310ee7c9737a7a0a7f1308abbfc1c31212b9a6" + integrity sha512-NzWvhk4akI2uhORUxMDMS/8yAdfp+nzvb5QdTE0eTD0WOrK16qAfYLSU/IjFc2J2lqhuPVxfO2XV7QoxgCXfwA== + dependencies: + "@walletconnect/socket-transport" "^1.4.1" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" + +"@walletconnect/http-connection@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.4.1.tgz#a36d3645eea2606c876e3824b7d46549bf237833" + integrity sha512-nxpaTjS89exDQQdrp/NJsbbfREio6WQ0aJ9+nZv1YGIIGVu/7WaNDuVY+UXbaBWPEKYrysf4nvzNHJ2BWhkqoA== dependencies: - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" eventemitter3 "4.0.7" xhr2-cookies "1.1.0" -"@walletconnect/iso-crypto@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.3.6.tgz#e6003d46fbc12b979e96269d94eebd8e801c0305" - integrity sha512-HypXNSmMAuEvNhllXWsCHtCVK4JfFFcZqPijurcXmOtWanjZV+8NuiYnKG11qAllSbYRwqKchb7GTDp33n0g0Q== +"@walletconnect/iso-crypto@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.4.1.tgz#0d9793c679d6c5443c49cce83f5d8dd476a65df2" + integrity sha512-rzfqM/DFhzNxBriMCU4DOarPkH+Brgll+2a2YeO6zHgMlwZtBKi5mMgzBwbDC3XygOvKbcRTB9G9hr8uYn+i5g== dependencies: "@pedrouid/iso-crypto" "^1.0.0" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" -"@walletconnect/mobile-registry@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.3.6.tgz#891d08b62c8e5c61f96203aad588c2c463c5d7f3" - integrity sha512-OhOCFJhUWKVbRzU9XcAcYIW9cC6gNb+kFttIAtjbaocRGgN+n5NDoUZsrrd6iurjvS6ToCWkalvlYbXDU5/xtw== +"@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.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.3.6.tgz#4ab9562e19069d453e04a3376f485aadf5f91de3" - integrity sha512-fQ7DQViX913EUc36rsglr6Jd76DbOiATUVroFZ8VeVcgbBuH9dTqBeCRuBCQ0MBe8v33IpRBjZDTsIdSOxFiaA== +"@walletconnect/qrcode-modal@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.4.1.tgz#58b78dc1dc02b1467fa3444da341ff375408c037" + integrity sha512-cIPKwYg+029UQY0natMyuNudxppYMfAzV2zAgdOSViphKTRY8RTI0DcJXVGPXEwx4k6Os3Vj6Fhqqo3RXOtgKg== dependencies: - "@walletconnect/mobile-registry" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/browser-utils" "^1.4.1" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.4.1" preact "10.4.1" qrcode "1.4.4" -"@walletconnect/socket-transport@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.3.6.tgz#702951831ff17db8f4c337dcdcb107cce377dae4" - integrity sha512-dvO8mRECU4I6FpoQX9GMh9BNzR2/g6vcj9LEIjgApW6Rfx0mCKUgoVBSi2W7NHC94zfdYiJdaH950oismj5gNw== +"@walletconnect/socket-transport@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.4.1.tgz#d9b7ebb9a2843cc44cf96c880c62be78d4a1625f" + integrity sha512-/5Mhu4bu3tS52LqTlmmjx5x/N89XqbuT0YMobvQ+k/m+VqSeBDntqIjwBt7XiFlCbrUTq3/yTajavGFxWFB6pA== dependencies: - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" ws "7.3.0" -"@walletconnect/types@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.3.6.tgz#892da6fb4570d9bc5450dc1a5810d7b4d345dd08" - integrity sha512-fNir3Pi1ZpuVlgNr8qtP2LOSsV9rNgJGHmBnHHqKNmpuRpPxG1mhmKFdDHNGyVIP5bM5CWIXmlULDTax63UJbg== +"@walletconnect/types@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.4.1.tgz#48297238b86f846b8c694504ca45f0059a2cca88" + integrity sha512-lzS9NbXjVb5N+W/UnCZAflxjLtYepUi4ev1IeFozSvr/cWxAhEe/sjixe7WEIpYklW27kfBhKccMH/KjUoRC7w== -"@walletconnect/utils@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.3.6.tgz#e55cb5510eb41b4ae6be8e88c1de42abf309bdd3" - integrity sha512-nzTO5A3Ltjrsu6u8SR/KqdHTH03848KIj5MQlOCUjwxW1fXOvuri8+kwFKqlMn0bk1Qvlt6rrOptbt14PW8kSA== +"@walletconnect/utils@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.4.1.tgz#86108470c211a02609274a6c7bbd516c5182a22e" + integrity sha512-JrVjcXmWVcU02fmVNZFBpJ48f84qyar24CF7szGv+k9ZxvU9J7XkM+Fic4790Dt3DaWhOzS9/eBUa+BEZcBbNw== dependencies: "@json-rpc-tools/utils" "1.6.1" - "@walletconnect/types" "^1.3.6" + "@walletconnect/browser-utils" "^1.4.1" + "@walletconnect/types" "^1.4.1" bn.js "4.11.8" - detect-browser "5.1.0" enc-utils "3.0.0" js-sha3 "0.8.0" query-string "6.13.5" - safe-json-utils "1.0.0" - window-getters "1.0.0" - window-metadata "1.0.0" -"@walletconnect/web3-provider@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.3.6.tgz#a09f0c08115475918ed4fe8d0503d28e29ac1877" - integrity sha512-49B7P4DjpK3LziW/IQTORc6+K2LmmK/qPFfjq/RWi5NIl/09D1D73UhCEIjZPJwNiAdd2V3wVKtSr/noj3PLgw== - dependencies: - "@walletconnect/client" "^1.3.6" - "@walletconnect/http-connection" "^1.3.6" - "@walletconnect/qrcode-modal" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" +"@walletconnect/web3-provider@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.4.1.tgz#34f6319ab2473ab9ff0fcf1e8bc280c697fa01ff" + integrity sha512-gUoBGM5hdtcXSoLXDTG1/WTamnUNpEWfaYMIVkfVnvVFd4whIjb0iOW5ywvDOf/49wq0C2+QThZL2Wc+r+jKLA== + dependencies: + "@walletconnect/client" "^1.4.1" + "@walletconnect/http-connection" "^1.4.1" + "@walletconnect/qrcode-modal" "^1.4.1" + "@walletconnect/types" "^1.4.1" + "@walletconnect/utils" "^1.4.1" web3-provider-engine "16.0.1" "@web3-react/abstract-connector@^6.0.7": @@ -4446,15 +5368,15 @@ "@web3-react/types" "^6.0.7" "@web3-react/authereum-connector@^6.1.1": - version "6.1.9" - resolved "https://registry.yarnpkg.com/@web3-react/authereum-connector/-/authereum-connector-6.1.9.tgz#90d53f486d304a251d35b07c19508b1d19598ab3" - integrity sha512-Q4Bm16WX8rzRpPW1Srb6r85gNgeD9t6JS89q+Xe5VehCh1O+81NM8DN4i4DQA8wWPeiP0Nf8IgzmU8nvwUn78A== + version "6.2.0" + resolved "https://registry.yarnpkg.com/@web3-react/authereum-connector/-/authereum-connector-6.2.0.tgz#d3e7379e4d6fc52add4bdd8dfdce1a2747ac23f0" + integrity sha512-we4DJwUrGbDd1gJ+cPMEGXq9+fsIEleJkFc+S+NEKyDoHoNGrPX8h4QqKRS3rgi6oCliPbtSPIf7g9DBjDFDTA== dependencies: "@web3-react/abstract-connector" "^6.0.7" "@web3-react/types" "^6.0.7" - authereum "^0.0.4-beta.157" + authereum "^0.1.14" -"@web3-react/core@^6.1.1": +"@web3-react/core@^6.1.1", "@web3-react/core@^6.1.9": version "6.1.9" resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.1.9.tgz#5f5daa0545a8ea07770a699580ced552583afc97" integrity sha512-P877DslsbAkWIlMANpWiK7pCvNwlz0kJC0EGckuVh0wlA23J4UnFxq6xyOaxkxaDCu14rA/tAO0NbwjcXTQgSA== @@ -4529,23 +5451,23 @@ integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A== "@web3-react/walletconnect-connector@^6.1.4": - version "6.1.9" - resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.1.9.tgz#3459ccf2a2ac7ae8f155645d29a517712afeb731" - integrity sha512-gPtcFFRAnRgqhmBjhH+dtuG3cx23X+JOX+mRO1D7dN+8yxLZhLhjOZlJFECH5hkC20KMM/sk+rq2yy6Vqp76PQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.2.0.tgz#5451f332a25b94cf7e615a20cc7d22a27532629d" + integrity sha512-F6xYwI3MKiSdKa0248y2wBW0kTDddc2/IGn4CjMSYe0DJFggtxFsAAGHQTRmvwDcLlgQwtemJJ0cTA82MOVfEg== dependencies: - "@walletconnect/web3-provider" "^1.3.6" + "@walletconnect/web3-provider" "^1.4.1" "@web3-react/abstract-connector" "^6.0.7" "@web3-react/types" "^6.0.7" tiny-invariant "^1.0.6" "@web3-react/walletlink-connector@^6.1.1": - version "6.1.9" - resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.1.9.tgz#3b27b79057ea3865b447a2ecdd3807d094f34061" - integrity sha512-0kgb28CsUp5k0MVdl3bk5FUSvgDl5psXyRLrXi2WFeHToOJTQnmMstVo9/1Mj36zaYHuSUcdcyLKnLGoabSivQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.2.0.tgz#7619bdca5a030b475b3a205f92f949d61e3b9b25" + integrity sha512-Vz0QOLHQnZD/xDJfZ+TJ19NLYqy0Ii62RKwaF0xiKnAIcwjrq8MVEPtnY7kB9G1g8EoCD2ghqnWb4NyZTltQHw== dependencies: "@web3-react/abstract-connector" "^6.0.7" "@web3-react/types" "^6.0.7" - walletlink "^2.0.2" + walletlink "^2.1.0" "@webassemblyjs/ast@1.9.0": version "1.9.0" @@ -4692,6 +5614,13 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@wry/context@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06" + integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q== + dependencies: + tslib "^2.1.0" + "@wry/equality@^0.1.2": version "0.1.11" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" @@ -4699,6 +5628,20 @@ dependencies: tslib "^1.9.3" +"@wry/equality@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.4.0.tgz#474491869a8d0590f4a33fd2a4850a77a0f63408" + integrity sha512-DxN/uawWfhRbgYE55zVCPOoe+jvsQ4m7PT1Wlxjyb/LCCLuU1UsucV2BbCxFAX8bjcSueFBbB5Qfj1Zfe8e7Fw== + dependencies: + tslib "^2.1.0" + +"@wry/trie@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" + integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug== + dependencies: + tslib "^2.1.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -4723,11 +5666,6 @@ mkdirp-promise "^5.0.1" mz "^2.5.0" -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - JSONStream@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" @@ -4744,7 +5682,7 @@ JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.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== @@ -4766,6 +5704,13 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abortable-iterator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-3.0.0.tgz#8ea796a237286b7fbe98d97e2505a15cdd81c0ac" + integrity sha512-7KqcPPnMhfot4GrEjK51zesS4Ye/lUCHBgYt3oRxIlU24HO3mVxBwEo9niNyfHqoWKqWLuZTc3zErNomdHA+ag== + dependencies: + get-iterator "^1.0.2" + abstract-leveldown@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" @@ -4787,6 +5732,28 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: 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@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.0.0.tgz#1a8bc3b07f502793804d456a881dc15cedb9bc5d" + integrity sha512-mFAi5sB/UjpNYglrQ4irzdmr2mbQtE94OJbrAYuK2yRARjH/OACinN1meOAorfnaLPMQdFymSQMlkiDm9AXXKQ== + dependencies: + buffer "^6.0.3" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.0" + queue-microtask "^1.2.3" + abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -4794,6 +5761,17 @@ abstract-leveldown@~2.6.0: 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.5, 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" @@ -4839,6 +5817,11 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.1.0: + version "8.2.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.3.tgz#37ba3771cfb1ee31a05950eef495259da28658c6" + integrity sha512-IJ3kohgrCGAVZrTAc2ufb2Hk2IAdkZTrMHo9DYDC5hX41HrcavlIL0nx31NQLdSkgAk8yE7oFSwPVYX17HWNHw== + address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -4867,6 +5850,11 @@ aes-js@^3.1.1, aes-js@^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@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -4895,7 +5883,7 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@^3.0.0: +aggregate-error@^3.0.0, aggregate-error@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== @@ -4903,6 +5891,21 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +airbnb-prop-types@^2.9.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" + integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg== + dependencies: + array.prototype.find "^2.1.1" + function.prototype.name "^1.1.2" + is-regex "^1.1.0" + object-is "^1.1.2" + object.assign "^4.1.0" + object.entries "^1.1.2" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.13.1" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -4923,10 +5926,10 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.2: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" - integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== +ajv@^8.0.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -4964,11 +5967,11 @@ ansi-escapes@^3.2.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + 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.11.0" + type-fest "^0.21.3" ansi-html@0.0.7, ansi-html@^0.0.7: version "0.0.7" @@ -4985,7 +5988,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +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== @@ -5019,6 +6022,14 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +any-signal@^2.1.0, any-signal@^2.1.1, any-signal@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -5028,54 +6039,55 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.3, anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + 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.0.1" - resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-2.0.1.tgz#cf5af56ea6ff5145e6eeb8d4ba471c7e0662b8c4" - integrity sha512-mJBw3pKmtfVoP6oifnf7/iRJQtNkVb6GkYsVOXN2pidootj1mhGBtzYHOX9FVBzAz5QV2GMu8IJtiNIgZ44kHQ== + 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" -apollo-cache-control@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.6.tgz#f7bdf924272af47ac474cf3f3f35cfc038cc9485" - integrity sha512-YZ+uuIG+fPy+mkpBS2qKF0v1qlzZ3PW6xZVaDukeK3ed3iAs4L/2YnkTqau3OmoF/VPzX2FmSkocX/OVd59YSw== +apollo-cache-control@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.13.0.tgz#cd63aa24a662b2fe89ef147a30df907c8061aedc" + integrity sha512-ImUXwVc/8K9QA3mQiKbKw8bOS4lMNL4DoP4hldIx+gwna8dgh3gBChgxW5guMOhcvH/55ximS7ZNWUglFmQY4Q== dependencies: - apollo-server-env "^3.0.0" - apollo-server-plugin-base "^0.10.4" + apollo-server-env "^3.1.0" + apollo-server-plugin-base "^0.12.0" -apollo-datasource@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.3.tgz#c824eb1457bdee5a3173ced0e35e594547e687a0" - integrity sha512-PE0ucdZYjHjUyXrFWRwT02yLcx2DACsZ0jm1Mp/0m/I9nZu/fEkvJxfsryXB6JndpmQO77gQHixf/xGCN976kA== +apollo-datasource@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.9.0.tgz#b0b2913257a6103a5f4c03cb56d78a30e9d850db" + integrity sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA== dependencies: - apollo-server-caching "^0.5.3" - apollo-server-env "^3.0.0" + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" -apollo-env@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.6.tgz#d7880805c4e96ee3d4142900a405176a04779438" - integrity sha512-hXI9PjJtzmD34XviBU+4sPMOxnifYrHVmxpjykqI/dUD2G3yTiuRaiQqwRwB2RCdwC1Ug/jBfoQ/NHDTnnjndQ== +apollo-env@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.10.0.tgz#8dd51bf974253a760ea15c81e870ff2c0d6e6820" + integrity sha512-7Geot+eyOl4jzPi9beiszeDmEEVZOVT11LSlkQluF5eaCNaIvld+xklZxITZGI/Wr+PQX380YJgQt1ndR2GtOg== dependencies: - "@types/node-fetch" "2.5.7" + "@types/node-fetch" "^2.5.10" core-js "^3.0.1" - node-fetch "^2.2.0" + node-fetch "^2.6.1" sha.js "^2.4.11" -apollo-graphql@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.6.1.tgz#d0bf0aff76f445de3da10e08f6974f1bf65f5753" - integrity sha512-ZRXAV+k+hboCVS+FW86FW/QgnDR7gm/xMUwJPGXEbV53OLGuQQdIT0NCYK7AzzVkCfsbb7NJ3mmEclkZY9uuxQ== +apollo-graphql@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.2.tgz#750ca9a97b59c868426defc95d9d9e1733ae4bdf" + integrity sha512-+c/vqC2LPq3e5kO7MfBxDDiljzLog/THZr9Pd46HVaKAhHUxFL0rJEbT17VhjdOoZGWFWLYG7x9hiN6EQD1xZQ== dependencies: - apollo-env "^0.6.6" + core-js-pure "^3.10.2" lodash.sortby "^4.7.0" + sha.js "^2.4.11" apollo-link@^1.2.14: version "1.2.14" @@ -5087,42 +6099,43 @@ apollo-link@^1.2.14: tslib "^1.9.3" zen-observable-ts "^0.8.21" -apollo-reporting-protobuf@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz#5572866be9b77f133916532b10e15fbaa4158304" - integrity sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw== +apollo-reporting-protobuf@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.7.0.tgz#622352d3eea943dff2647741a509b39d464f98a9" + integrity sha512-PC+zDqPPJcseemqmvUEqFiDi45pz6UaPWt6czgmrrbcQ+9VWp6IEkm08V5xBKk7V1WGUw19YwiJ7kqXpcgVNyw== dependencies: - "@apollo/protobufjs" "^1.0.3" + "@apollo/protobufjs" "1.2.2" -apollo-server-caching@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz#cf42a77ad09a46290a246810075eaa029b5305e1" - integrity sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ== +apollo-server-caching@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39" + integrity sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw== dependencies: lru-cache "^6.0.0" -apollo-server-core@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.21.0.tgz#12ee11aee61fa124f11b1d73cae2e068112a3a53" - integrity sha512-GtIiq2F0dVDLzzIuO5+dK/pGq/sGxYlKCqAuQQqzYg0fvZ7fukyluXtcTe0tMI+FJZjU0j0WnKgiLsboCoAlPQ== +apollo-server-core@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.24.0.tgz#60313e5bd265422d53fe0ffbd45760046465f5f0" + integrity sha512-uW7gykPzhin9fLgSvciN8tX7098mHnUM79W3+fWfK5J415JidIqW9O+JhYmEPo6BCgosu0cKSdYe7NB+FP4lFQ== dependencies: - "@apollographql/apollo-tools" "^0.4.3" - "@apollographql/graphql-playground-html" "1.6.26" + "@apollographql/apollo-tools" "^0.5.0" + "@apollographql/graphql-playground-html" "1.6.27" "@apollographql/graphql-upload-8-fork" "^8.1.3" + "@josephg/resolvable" "^1.0.0" "@types/ws" "^7.0.0" - apollo-cache-control "^0.11.6" - apollo-datasource "^0.7.3" - apollo-graphql "^0.6.0" - apollo-reporting-protobuf "^0.6.2" - apollo-server-caching "^0.5.3" - apollo-server-env "^3.0.0" - apollo-server-errors "^2.4.2" - apollo-server-plugin-base "^0.10.4" - apollo-server-types "^0.6.3" - apollo-tracing "^0.12.2" + apollo-cache-control "^0.13.0" + apollo-datasource "^0.9.0" + apollo-graphql "^0.9.0" + apollo-reporting-protobuf "^0.7.0" + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" + apollo-server-errors "^2.5.0" + apollo-server-plugin-base "^0.12.0" + apollo-server-types "^0.8.0" + apollo-tracing "^0.14.0" async-retry "^1.2.1" fast-json-stable-stringify "^2.0.0" - graphql-extensions "^0.12.8" + graphql-extensions "^0.14.0" graphql-tag "^2.11.0" graphql-tools "^4.0.8" loglevel "^1.6.7" @@ -5132,35 +6145,35 @@ apollo-server-core@^2.21.0: uuid "^8.0.0" ws "^6.0.0" -apollo-server-env@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.0.0.tgz#0157c51f52b63aee39af190760acf789ffc744d9" - integrity sha512-tPSN+VttnPsoQAl/SBVUpGbLA97MXG990XIwq6YUnJyAixrrsjW1xYG7RlaOqetxm80y5mBZKLrRDiiSsW/vog== +apollo-server-env@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0" + integrity sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ== dependencies: - node-fetch "^2.1.2" + node-fetch "^2.6.1" util.promisify "^1.0.0" -apollo-server-errors@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz#1128738a1d14da989f58420896d70524784eabe5" - integrity sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ== +apollo-server-errors@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz#5d1024117c7496a2979e3e34908b5685fe112b68" + integrity sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA== -apollo-server-express@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.21.0.tgz#29bd4ec728e1992da240c5956c3ce6d95c1d252e" - integrity sha512-zbOSNGuxUjlOFZnRrbMpga3pKDEroitF4NAqoVxgBivx7v2hGsE7rljct3PucTx2cMN90AyYe3cU4oA8jBxZIQ== +apollo-server-express@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.24.0.tgz#f17444929fc776fa1c166d8bad9685bd65dfa1c9" + integrity sha512-wVoD53azxqVZt/i4yAm6cDDCXpbzr0AJpzOdNXVFW/KivInWEMF5ekCc80uMOawPeu78U7Skoc20akyvZKc+YA== dependencies: - "@apollographql/graphql-playground-html" "1.6.26" + "@apollographql/graphql-playground-html" "1.6.27" "@types/accepts" "^1.3.5" "@types/body-parser" "1.19.0" - "@types/cors" "2.8.8" - "@types/express" "4.17.7" - "@types/express-serve-static-core" "4.17.18" + "@types/cors" "2.8.10" + "@types/express" "4.17.11" + "@types/express-serve-static-core" "4.17.19" accepts "^1.3.5" - apollo-server-core "^2.21.0" - apollo-server-types "^0.6.3" + apollo-server-core "^2.24.0" + apollo-server-types "^0.8.0" body-parser "^1.18.3" - cors "^2.8.4" + cors "^2.8.5" express "^4.17.1" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.8" @@ -5168,41 +6181,41 @@ apollo-server-express@^2.21.0: subscriptions-transport-ws "^0.9.16" type-is "^1.6.16" -apollo-server-plugin-base@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.4.tgz#fbf73f64f95537ca9f9639dd7c535eb5eeb95dcd" - integrity sha512-HRhbyHgHFTLP0ImubQObYhSgpmVH4Rk1BinnceZmwudIVLKrqayIVOELdyext/QnSmmzg5W7vF3NLGBcVGMqDg== +apollo-server-plugin-base@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.12.0.tgz#9063c47e84c849c4227b9398cd06994f13b3a4c3" + integrity sha512-jnNIztYz34ImE7off0t9LwseGCR/J0H1wlbiBGvdXvQY+ZiMfVF2oF8KdSAPxG2vT6scvWP4GFS/FsZcOyP1Xw== dependencies: - apollo-server-types "^0.6.3" + apollo-server-types "^0.8.0" -apollo-server-types@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.3.tgz#f7aa25ff7157863264d01a77d7934aa6e13399e8" - integrity sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg== +apollo-server-types@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.8.0.tgz#5462c99e93c5b6896d686bc234c05850059b2efe" + integrity sha512-adHJnHbRV2kWUY0VQY1M2KpSdGfm+4mX4w+2lROPExqOnkyTI7CGfpJCdEwYMKrIn3aH8HIcOH0SnpWRet6TNw== dependencies: - apollo-reporting-protobuf "^0.6.2" - apollo-server-caching "^0.5.3" - apollo-server-env "^3.0.0" + apollo-reporting-protobuf "^0.7.0" + apollo-server-caching "^0.7.0" + apollo-server-env "^3.1.0" apollo-server@^2.18.2: - version "2.21.0" - resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.21.0.tgz#4e62131885b4a8a26bb8b5e77177bd0d4d210852" - integrity sha512-OqngjOSB0MEH6VKGWHcrqt4y39HlhYh9CrMvn4PhadTt53IPYRmBglk5qSRA8xMorGqy60iKrOReqj5YfCjTOg== + version "2.24.0" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.24.0.tgz#68747b786af16803da0d0fa915334f4c81f312c4" + integrity sha512-KYYyBRLvqJaXFk64HfdgPilm8bqc2ON3hwhWmWx2Apsy4PC7paVK4gYFAUh9piPpeVZfF3t7zm+2J+9R47otjA== dependencies: - apollo-server-core "^2.21.0" - apollo-server-express "^2.21.0" + apollo-server-core "^2.24.0" + apollo-server-express "^2.24.0" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.8" stoppable "^1.1.0" -apollo-tracing@^0.12.2: - version "0.12.2" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.12.2.tgz#a261c3970bb421b6dadf50cd85d75b2567a7e52c" - integrity sha512-SYN4o0C0wR1fyS3+P0FthyvsQVHFopdmN3IU64IaspR/RZScPxZ3Ae8uu++fTvkQflAkglnFM0aX6DkZERBp6w== +apollo-tracing@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.14.0.tgz#2b7e07e6f1cb9d6161f03dc6e51baaa8468735bd" + integrity sha512-KH4mOoicZ2CQkEYVuNP9avJth59LwNqku3fKZ4S0UYE1RfxzIoLLsEyuY8MuJEgNdtKKfkX5G5Kn5Rp4LCJ4RQ== dependencies: - apollo-server-env "^3.0.0" - apollo-server-plugin-base "^0.10.4" + apollo-server-env "^3.1.0" + apollo-server-plugin-base "^0.12.0" apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: version "1.3.4" @@ -5237,6 +6250,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.1.tgz#ded3abf645efd3b5f7e446035b75aad6fd68aa71" + integrity sha512-cvmPpB9OWbIP0pG3ov/11PMd/z+nBG+nY4eynzHxX/+pxJg7f5r02rFeJr8NwosJpxHIujA2jJpB+c3xR21vig== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -5249,7 +6267,7 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^4.0.2, aria-query@^4.2.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== @@ -5291,6 +6309,11 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + array-differ@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" @@ -5321,7 +6344,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1, array-includes@^3.1.2: +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== @@ -5332,6 +6355,11 @@ array-includes@^3.1.1, array-includes@^3.1.2: get-intrinsic "^1.1.1" is-string "^1.0.5" +array-shuffle@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/array-shuffle/-/array-shuffle-2.0.0.tgz#fd36437cd7997d557055283c946e46379a7cd343" + integrity sha512-rJTchCppiO6QsQnN51KDH1cgMYm13B+ybxFS5GgdBdTTHpZcrq3M7SOBgzp+L9fqqnjkFDiwdEVcX1wINgl9DQ== + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -5354,6 +6382,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.find@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" + integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.4" + array.prototype.flat@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" @@ -5363,7 +6399,7 @@ array.prototype.flat@^1.2.3: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" -array.prototype.flatmap@^1.2.3: +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== @@ -5373,7 +6409,12 @@ array.prototype.flatmap@^1.2.3: es-abstract "^1.18.0-next.1" function-bind "^1.1.1" -arrify@^1.0.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.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -5383,7 +6424,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0, asap@~2.0.6: +asap@^2.0.0, asap@~2.0.3, 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= @@ -5459,13 +6500,18 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-eventemitter@^0.2.2: +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-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -5485,6 +6531,11 @@ async-retry@^1.2.1: dependencies: retry "0.12.0" +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -5497,7 +6548,7 @@ async@2.6.2: dependencies: lodash "^4.17.11" -async@3.2.0: +async@3.2.0, async@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== @@ -5529,10 +6580,10 @@ atob@^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.0.4-beta.157: - version "0.0.4-beta.201" - resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.0.4-beta.201.tgz#ea380efc6d231dc4222dc20cd9395b02318dd0c3" - integrity sha512-9zyS2nDsO5nW/8dD8SbGUbZLX76O5Zrx6Zq4aZG+Waa3Vsn3Bj82tn8HLPdECmd5heSOmaSEi5TNsS/sGBSiGw== +authereum@^0.1.14: + 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" @@ -5580,9 +6631,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.0.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.3.tgz#64a4c85509e0991f5168340edc4bedd1ceea6966" - integrity sha512-vwPpH4Aj4122EW38mxO/fxhGKtwWTMLDIJfZ1He0Edbtjcfna/R3YB67yVhezUMzqc3Jr3+Ii50KRntlENL4xQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.0.tgz#6594db4ee62f78be79e32a7295d21b099b60668d" + integrity sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg== axios@^0.18.0: version "0.18.1" @@ -5592,7 +6643,7 @@ axios@^0.18.0: follow-redirects "1.5.10" is-buffer "^2.0.2" -axios@^0.21.0, 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== @@ -5865,31 +6916,31 @@ babel-plugin-named-asset-import@^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.1.4: - version "0.1.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" - integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA== +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== dependencies: - "@babel/compat-data" "^7.13.0" - "@babel/helper-define-polyfill-provider" "^0.1.5" + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" - integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" - core-js-compat "^3.8.1" + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" -babel-plugin-polyfill-regenerator@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" - integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg== +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" + "@babel/helper-define-polyfill-provider" "^0.2.0" -"babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.10.7: +"babel-plugin-styled-components@>= 1.12.0", babel-plugin-styled-components@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz#1dec1676512177de6b827211e9eda5a30db4f9b9" integrity sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA== @@ -6322,7 +7373,7 @@ babylon@^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: +backo2@1.0.2, backo2@^1.0.2, 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= @@ -6335,9 +7386,9 @@ backoff@^2.5.0: precond "0.2" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: version "3.0.8" @@ -6346,11 +7397,21 @@ base-x@^3.0.2, base-x@^3.0.8: dependencies: safe-buffer "^5.0.1" +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== +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -6376,15 +7437,23 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bcrypto@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.4.0.tgz#4046f0c44a4b301eff84de593b4f86fce8d91db2" + integrity sha512-KDX2CR29o6ZoqpQndcCxFZAtYA1jDMnXU3jmCfzP44g++Cu7AHHtZN/JbrN/MXAg9SLvtQ8XISG+eVD9zH1+Jg== + dependencies: + bufio "~1.0.7" + loady "~0.0.5" + bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== before-after-hook@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.1.tgz#99ae36992b5cfab4a83f6bee74ab27835f28f405" - integrity sha512-5ekuQOvO04MDj7kYZJaMab2S8SPjGJbotVNyv7QYFCOAwrGZs/YnoDNlh1U+m5hl7H2D/+n0taaAV/tfyd3KMA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== bfj@^7.0.2: version "7.0.2" @@ -6396,11 +7465,26 @@ bfj@^7.0.2: hoopy "^0.1.4" tryer "^1.0.1" +big-integer@^1.6.32, big-integer@^1.6.48: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + 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== +bigi@^1.1.0, bigi@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" + integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= + +bignumber.js@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.0.2.tgz#2d9ce9428249896d6ef528b2abadf69a405cf365" + integrity sha512-TosM7Yg1Ux0ZCNwwS/tW95r3q9xIZstgsUGKWaez0Cgq8Oy3qia9RGvyG/fbxlQAvigjza1d057QNQLGvYXCeg== + 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" @@ -6433,6 +7517,11 @@ bindings@^1.2.1, bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bintrees@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" + integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= + bip39@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" @@ -6475,11 +7564,66 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bl@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.0.0.tgz#6928804a41e9da9034868e1c50ca88f21f57aea2" + integrity sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blake-hash@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-1.1.1.tgz#b6251600d7812dd5097f96cb341ceae245bf9d12" + integrity sha512-V93H+FEJuXXZi1eEsMtbcBFP9oL5Ept7SLw3cbXYlPC3nocm9Fr4m18ZhbhdJrZVS9J/Z0oNE4L3oDZvmorHNA== + dependencies: + bindings "^1.2.1" + inherits "^2.0.3" + nan "^2.2.1" + +blake2b-wasm@^1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz#e4d075da10068e5d4c3ec1fb9accc4d186c55d81" + integrity sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA== + dependencies: + nanoassert "^1.0.0" + +blake2b@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.3.tgz#f5388be424768e7c6327025dad0c3c6d83351bca" + integrity sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg== + dependencies: + blake2b-wasm "^1.1.0" + nanoassert "^1.0.0" + blakejs@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= +blindsecp256k1@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/blindsecp256k1/-/blindsecp256k1-0.0.6.tgz#b2c81273500b0213948463ab1ecc50e819fb4405" + integrity sha512-M+QV0G6h5FIR0eqiRkW3DySMoDoobHkr8Zrcx1kLxuvbpZaBI5NL60LI3c600TaHz4TuEJB2C2BdDWsA6JYl4w== + dependencies: + "@ethersproject/keccak256" "5.0.7" + bigi "^1.4.2" + bignumber.js "7.0.2" + ecurve "1.0.0" + +blob-to-it@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.2.tgz#bc76550638ca13280dbd3f202422a6a132ffcc8d" + integrity sha512-yD8tikfTlUGEOSHExz4vDCIQFLaBPXIL0KcxGQt9RbwMVXBEh+jokdJyStvTXPgWrdKfwgk7RX8GPsgrYzsyng== + dependencies: + browser-readablestream-to-it "^1.0.2" + +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.1, bluebird@^3.5.2, bluebird@^3.5.3, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -6556,6 +7700,19 @@ borc@^2.1.2: json-text-sequence "~0.1.0" readable-stream "^3.6.0" +borc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/borc/-/borc-3.0.0.tgz#49ada1be84de86f57bb1bb89789f34c186dfa4fe" + integrity sha512-ec4JmVC46kE0+layfnwM3l15O70MlFiEbmQHY/vpqIKiUtPVntv4BY4NVnz3N4vb21edV3mY97XVckFvYHWF9g== + dependencies: + bignumber.js "^9.0.0" + buffer "^6.0.3" + commander "^2.15.0" + ieee754 "^1.1.13" + iso-url "^1.1.5" + json-text-sequence "~0.3.0" + readable-stream "^3.6.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -6597,6 +7754,11 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.2.tgz#f6b8d18e7a35b0321359261a32aa2c70f46921c4" + integrity sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -6681,16 +7843,16 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, 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.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" bs-logger@0.x: version "0.2.6" @@ -6794,6 +7956,14 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.4.3, buffer@^5.5.0, buffe base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.1, 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" + bufferutil@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" @@ -6801,6 +7971,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.2.0" +bufio@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.0.7.tgz#b7f63a1369a0829ed64cc14edf0573b3e382a33e" + integrity sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A== + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -6843,7 +8018,7 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: +bytes@3.1.0, 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== @@ -6885,9 +8060,9 @@ cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: y18n "^4.0.0" cacache@^15.0.5: - version "15.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" - integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + version "15.0.6" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.6.tgz#65a8c580fda15b59150fb76bf3f3a8e45d583099" + integrity sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w== dependencies: "@npmcli/move-file" "^1.0.1" chownr "^2.0.0" @@ -6903,7 +8078,7 @@ cacache@^15.0.5: p-map "^4.0.0" promise-inflight "^1.0.1" rimraf "^3.0.2" - ssri "^8.0.0" + ssri "^8.0.1" tar "^6.0.2" unique-filename "^1.1.1" @@ -7054,10 +8229,10 @@ caniuse-api@^3.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.30001181: - version "1.0.30001196" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001196.tgz#00518a2044b1abf3e0df31fadbe5ed90b63f4e64" - integrity sha512-CPvObjD3ovWrNBaXlAIGWmg2gQQuJ5YhuciUOjPRox6hIQttu8O+b51dx6VIpIY9ESd2d0Vac1RKpICdG4rGUg== +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.30001221" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001221.tgz#b916721ddf59066cfbe96c5c9a77cf7ae5c52e65" + integrity sha512-b9TOZfND3uGSLjMOrLh8XxSQ41x8mX+9MLJYDM4AAHLfaZHttrLNPrScWjVnBITRZbY5sPpCt7X85n7VSLZ+/g== capture-exit@^2.0.0: version "2.0.0" @@ -7076,6 +8251,11 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catering@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.0.0.tgz#15ce31bcbffafbf62855ea7677b0e5d23581233d" + integrity sha512-aD/WmxhGwUGsVPrj8C80vH7C7GphJilYVSdudoV4u16XdrLF7CVyfBmENsc4tLTVsJJzCRid8GbwJ7mcPLee6Q== + cbor@^5.0.2: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -7084,10 +8264,20 @@ cbor@^5.0.2: bignumber.js "^9.0.1" nofilter "^1.0.4" -chai@^4.2.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.3.tgz#f2b2ad9736999d07a7ff95cf1e7086c43a76f72d" - integrity sha512-MPSLOZwxxnA0DhLE84klnGPojWFK5KuhP7/j5dTsxpr2S3XlkqJP5WbyYl1gCTWvG2Z5N+HD4F472WsbEZL6Pw== +cborg@^1.0.4, cborg@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.3.1.tgz#7f8ac75bd09eec60bc6720e9d7cebbdcaa806e4c" + integrity sha512-neK2ovbsVY9KFKDUdwifRO0U6p0Y7mZ/08nPgPEV20mABkui+9Fiic63eiPg1TnWuD+Vzjmtp2xUWEdv+AtgFg== + +chai-checkmark@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chai-checkmark/-/chai-checkmark-1.0.1.tgz#9fbb3c9ad9101f097ef288328d30f4227d74fffb" + integrity sha1-n7s8mtkQHwl+8ogyjTD0In10//s= + +chai@^4.2.0, chai@^4.3.4: + 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" @@ -7096,15 +8286,15 @@ chai@^4.2.0: pathval "^1.1.1" type-detect "^4.0.5" -chalk@*, chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +chalk@*, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + 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" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.1, 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== @@ -7113,7 +8303,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: +chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -7219,11 +8409,9 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + 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" @@ -7241,7 +8429,7 @@ cids@^0.7.1, cids@~0.7.0, cids@~0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" -cids@^1.0.0: +cids@^1.0.0, cids@^1.1.5, cids@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.6.tgz#ac7aea7dbcabaa64ca242b5d970d596a5c34d006" integrity sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ== @@ -7270,6 +8458,51 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circom@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/circom/-/circom-0.5.3.tgz#bf157c17ec973f1960b09b505ab6a8a23946d4de" + integrity sha512-uKmcWE+qvy7+wJ4aXxv2cfNJxhdAV7NiXwCWsiBCzwhzFpA2P+JQQGgUj7C1GIMiJLNmmhx62jWnXW+fQ2PvBw== + dependencies: + big-integer "^1.6.32" + chai "^4.2.0" + circom_runtime "0.0.3" + ffiasm "0.0.2" + ffjavascript "0.0.3" + ffwasm "0.0.6" + fnv-plus "^1.3.1" + r1csfile "0.0.3" + tmp-promise "^2.0.2" + wasmbuilder "0.0.10" + +circom_runtime@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.0.3.tgz#079d698bf8b95b0661f78bfccaf88784218bf2ad" + integrity sha512-z4ypbs9cTQn7+2FHZNTnccMj6kQCcKT2agYqCrm2kdLBJh9LDoxU1JVu5mSnVuOtgc7BclQ7r0xclG0zP2rxhw== + dependencies: + big-integer "^1.6.48" + fnv-plus "^1.3.1" + +circom_runtime@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.0.6.tgz#ef20ed273f03a5fdd699fd889b01feb9e13ada44" + integrity sha512-o0T5MuWzxnxinWG3+CygS/kZouoP+z5ZrufUwqKJy3gsVFJhkbqMpfKmcBGjhExB3uatA7cKyOiRAOLOz5+t5w== + dependencies: + ffjavascript "0.1.0" + fnv-plus "^1.3.1" + +circomlib@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/circomlib/-/circomlib-0.1.2.tgz#5f7e28f9d5ad0a8c05382a6d8a58ac8d4dc31228" + integrity sha512-pZMDmcQp9Z/XJ1MpycJDaNEtOKS8G3QGFlKszwEZHZLRch44M8yxoDcYGcjaI8lprh/8QHEHLyeVZWwGTiRacQ== + dependencies: + blake-hash "^1.1.0" + blake2b "^2.1.3" + circom "0.5.3" + ffjavascript "0.0.3" + snarkjs "^0.1.22" + typedarray-to-buffer "^3.1.5" + web3 "^1.2.6" + 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" @@ -7317,9 +8550,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + 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: version "0.5.1" @@ -7331,16 +8564,19 @@ cli-table3@~0.5.0: optionalDependencies: colors "^1.1.2" +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -clipboard-polyfill@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/clipboard-polyfill/-/clipboard-polyfill-3.0.2.tgz#6d45719421395257460e09febb5dffa495a2878b" - integrity sha512-1DTdwGicGBAhK4/VjOwFYG3fAu1aj1n/jC/00qkRyDobKSB/PF8mhJkbAlDGbNEc8hIrPElv5j96OE5PwHMUfA== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -7350,6 +8586,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + 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" @@ -7368,6 +8613,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -7394,7 +8648,7 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.1.0: +clsx@^1.0.2, clsx@^1.0.4, 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== @@ -7456,9 +8710,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + 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" @@ -7496,7 +8750,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -command-exists@^1.2.8: +command-exists@^1.2.6, 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== @@ -7525,6 +8779,16 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -7543,11 +8807,26 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: +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.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +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" @@ -7761,7 +9040,7 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@^0.4.1: +cookie@^0.4.1, 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== @@ -7788,18 +9067,18 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.6.2, core-js-compat@^3.8.1, core-js-compat@^3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" - integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== +core-js-compat@^3.6.2, core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.11.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.11.2.tgz#5048e367851cfd2c6c0cb81310757b4da296e385" + integrity sha512-gYhNwu7AJjecNtRrIfyoBabQ3ZG+llfPmg9BifIX8yxIpDyfNLRM73zIjINSm6z3dMdI1nwNC9C7uiy4pIC6cw== dependencies: - browserslist "^4.16.3" + browserslist "^4.16.6" semver "7.0.0" -core-js-pure@^3.0.0, core-js-pure@^3.0.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.1.tgz#677b322267172bd490e4464696f790cbc355bec5" - integrity sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A== +core-js-pure@^3.0.0, core-js-pure@^3.0.1, core-js-pure@^3.10.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.11.2.tgz#10e3b35788c00f431bc0d601d7551475ec3e792c" + integrity sha512-DQxdEKm+zFsnON7ZGOgUAQXBt1UJJ01tOzN/HgQ7cNf0oEHW1tcBLfCQQd1q6otdLu5gAdvKYxKHAoXGwE/kiQ== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -7807,16 +9086,16 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.0.1, core-js@^3.6.5: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae" - integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg== + version "3.11.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.2.tgz#af087a43373fc6e72942917c4a4c3de43ed574d6" + integrity sha512-3tfrrO1JpJSYGKnd9LKTBPqgUES/UYiCzMKeqwR1+jF16q4kD1BY2NvqkfuzXwQ6+CIWm55V9cjD7PQd+hijdw== 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, cors@^2.8.4: +cors@^2.8.1, cors@^2.8.5, cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -7867,6 +9146,14 @@ coveralls@^3.1.0: minimist "^1.2.5" request "^2.88.2" +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" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -7898,11 +9185,26 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-react-context@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + 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" @@ -7911,14 +9213,7 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "2.1.2" whatwg-fetch "2.0.4" -cross-fetch@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" - integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== - dependencies: - node-fetch "2.6.1" - -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -8051,13 +9346,21 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + 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-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + css-what@^3.2.1: version "3.4.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" @@ -8068,7 +9371,7 @@ css.escape@^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, css@^2.2.3: +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== @@ -8078,6 +9381,15 @@ css@^2.0.0, css@^2.2.3: 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" @@ -8098,10 +9410,10 @@ cssfilter@0.0.10: resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +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" @@ -8131,7 +9443,7 @@ cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -8157,12 +9469,12 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + 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.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -8183,17 +9495,22 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.2.0: +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@^2.5.2: + version "2.6.17" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" + integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== + csstype@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" - integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== + 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" @@ -8202,6 +9519,13 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +customize-cra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d" + integrity sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA== + dependencies: + lodash.flow "^3.5.0" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -8215,6 +9539,14 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +dag-cbor-links@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dag-cbor-links/-/dag-cbor-links-2.0.2.tgz#aac10b4472ddedda05b2e7d606b3ca760f457e5e" + integrity sha512-PS5skw2eGKVZ1VVu9wquoIoefgMvKhl9/OItzf+7UMot0Nnd3oe/Ai5AP48GvEkAi6GkmglhWwuoKF23hTHJqQ== + dependencies: + cids "^1.0.0" + ipld-dag-cbor "^0.17.0" + damerau-levenshtein@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" @@ -8243,10 +9575,57 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@^2.16.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.19.0.tgz#65193348635a28d5d916c43ec7ce6fbd145059e1" - integrity sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg== +datastore-core@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-4.0.0.tgz#b62184244929109ba05f935fc2abb9d0d7cbb691" + integrity sha512-gTSysof1fKNNpNa2N3uCerp5zE10KvWci/OucmuR+4uWODLu3i6Egp6EDDC4mK/xPremRF9rj92jnGVBjCe5Zg== + dependencies: + debug "^4.1.1" + interface-datastore "^4.0.0" + it-filter "^1.0.2" + it-map "^1.0.5" + it-merge "^1.0.1" + it-take "^1.0.1" + uint8arrays "^2.1.5" + +datastore-fs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/datastore-fs/-/datastore-fs-4.0.1.tgz#3b177ea52d4ddf86273609dd3aa61969e62b8587" + integrity sha512-p9utuLpQ90+dbjzhbvCZNB4B8/HY04bfzIOj6oHAYhldkKAzfEqIOdKJNEYP08BezqtUf+FkAs5ycSaUjY8q3A== + dependencies: + datastore-core "^4.0.0" + fast-write-atomic "^0.2.0" + interface-datastore "^4.0.0" + it-glob "^0.0.11" + it-map "^1.0.5" + mkdirp "^1.0.4" + +datastore-level@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/datastore-level/-/datastore-level-5.0.1.tgz#a8216db8f9d68e904eab176a8649f807b5590c3c" + integrity sha512-cCivAtFTfDslingk9YkY+n9icSbCeG53zduNmO2XtmXBKoH3rEttRJAdQxt4W2fF2kr0DLmOV40f9vcqUBZ1Ew== + dependencies: + datastore-core "^4.0.0" + interface-datastore "^4.0.0" + it-filter "^1.0.2" + it-map "^1.0.5" + it-take "^1.0.1" + level "^7.0.0" + +datastore-pubsub@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/datastore-pubsub/-/datastore-pubsub-0.6.1.tgz#08a63651e4e249fcfd4d0c1e499f177eaae8228a" + integrity sha512-5pezaz2To1jHcqbyRYGklwPLdh41mFLKw0RMWoznAdXFcTKaDl/cxVPFYLK4YAXn1vBgqg9DevIPTVOmBV0Qfg== + dependencies: + debug "^4.2.0" + err-code "^3.0.1" + interface-datastore "^4.0.0" + uint8arrays "^2.0.5" + +date-fns@^2.21.3: + version "2.21.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.3.tgz#8f5f6889d7a96bbcc1f0ea50239b397a83357f9b" + integrity sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw== dateformat@^3.0.0: version "3.0.3" @@ -8261,6 +9640,11 @@ dateformat@~1.0.4-1.2.3: get-stdin "^4.0.1" meow "^3.3.0" +dayjs@^1.8.14: + version "1.10.4" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" + integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== + death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" @@ -8273,7 +9657,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.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== @@ -8287,20 +9671,27 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.0, debug@^4.3.1, debug@~4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: 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" +debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -8319,7 +9710,7 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.0: +decimal.js@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== @@ -8390,6 +9781,13 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" +default-gateway@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -8402,6 +9800,14 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +deferred-leveldown@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-6.0.0.tgz#364dc436682eccbd4a25a5fd5585614770d0d3d6" + integrity sha512-F6CLAZzNeURojlH4MCigZr54tNz+xDSi06YXsDr5uLSKeF3JKnvnQWTqd+RETh2hbWTJR3qDzGicQOWS5ZQ1BQ== + dependencies: + abstract-leveldown "^7.0.0" + inherits "^2.0.3" + deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -8417,6 +9823,14 @@ deferred-leveldown@~4.0.0: 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" @@ -8451,6 +9865,19 @@ defined@^1.0.0, defined@~1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -8464,6 +9891,11 @@ del@^4.1.1: 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" @@ -8479,6 +9911,11 @@ delimit-stream@0.1.0: resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= +denque@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" + integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -8522,10 +9959,10 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-browser@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.1.0.tgz#0c51c66b747ad8f98a6832bf3026a5a23a7850ff" - integrity sha512-WKa9p+/MNwmTiS+V2AS6eGxic+807qvnV3hC+4z2GTY+F42h1n8AynVTMMc4EJBC32qMs6yjOTpeDEQQt/AVqQ== +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-indent@^4.0.0: version "4.0.0" @@ -8550,9 +9987,9 @@ detect-newline@^3.0.0: integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.0.5" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz#9d270aa7eaa5af0b72c4c9d9b814e7f4ce738b79" + integrity sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw== detect-port-alt@1.1.6: version "1.1.6" @@ -8594,11 +10031,6 @@ dicer@0.3.0: dependencies: streamsearch "0.1.2" -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" @@ -8609,7 +10041,7 @@ diff@3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@^4.0.1: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -8642,19 +10074,29 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dirty-chai@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/dirty-chai/-/dirty-chai-2.0.1.tgz#6b2162ef17f7943589da840abc96e75bda01aff3" + integrity sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w== + discord.js@^12.3.1: - version "12.5.1" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.1.tgz#992b45753e3815526a279914ccc281d3496f5990" - integrity sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w== + version "12.5.3" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" + integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" abort-controller "^3.0.0" node-fetch "^2.6.1" - prism-media "^1.2.2" + prism-media "^1.2.9" setimmediate "^1.0.5" tweetnacl "^1.0.3" - ws "^7.3.1" + ws "^7.4.4" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== dns-equal@^1.0.0: version "1.0.0" @@ -8662,11 +10104,11 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-over-http-resolver@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.2.tgz#148740c1b14d81b78078a1af1d606f2d0c6cc255" - integrity sha512-4J7LoLl26mczU6LdWlhvNM51aWXHJmTz6iDUrGz1sqiAgNb6HzBc/huvkgqS6bYfbCzvlOKW/bGkugReliac0A== + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== dependencies: - debug "^4.2.0" + debug "^4.3.1" native-fetch "^3.0.0" receptacle "^1.3.2" @@ -8678,6 +10120,14 @@ dns-packet@^1.3.1: ip "^1.1.0" safe-buffer "^5.0.1" +dns-packet@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-4.2.0.tgz#3fd6f5ff5a4ec3194ed0b15312693ffe8776b343" + integrity sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw== + dependencies: + ip "^1.1.5" + safe-buffer "^5.1.1" + dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" @@ -8686,9 +10136,11 @@ dns-txt@^2.0.2: buffer-indexof "^1.0.0" docker-compose@^0.23.2: - version "0.23.6" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.6.tgz#bd21e17d599f17fcf7a4b5d607cff0358a9c378b" - integrity sha512-y3Q8MkwG862rNqkvEQG59/7Fi2/fzs3NYDCvqUAAD+z0WGs2qcJ9hRcn34hWgWv9ouPkFqe3Vwca0h+4bIIRWw== + version "0.23.8" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.8.tgz#475b1e1294821d380316c54277ad350074186c6f" + integrity sha512-uUxjnz77oU+HBwwRYKO/O5a1IywSZbWNayC1+q4e4t3HzKwBHi+5pmIpESjpsEvIVl/HWAC3mPB89NjUNEBWuQ== + dependencies: + yaml "^1.10.2" docker-modem@^1.0.8: version "1.0.9" @@ -8731,11 +10183,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" - integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== - dom-accessibility-api@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" @@ -8748,6 +10195,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -8772,9 +10227,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domexception@^2.0.1: version "2.0.1" @@ -8851,7 +10306,7 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -8866,6 +10321,41 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +dvote-js@^1.9.14: + version "1.9.14" + resolved "https://registry.yarnpkg.com/dvote-js/-/dvote-js-1.9.14.tgz#db0e3c1cdb615a19b41ad5f8c75e2a7262024148" + integrity sha512-6UiE6wXmB8Mxrjo7pVJDaKDgo97ikSYWQC/6r1fPNj7Axj2QfjPPE0iX9s4vWqU0QjIwXvDEzR1blATJQi/LpQ== + dependencies: + "@vocdoni/storage-proofs-eth" "^0.3.2" + axios "^0.21.1" + blindsecp256k1 "0.0.6" + buffer "^6.0.3" + circomlib "^0.1.2" + dvote-solidity "^1.3.1" + ethers "^5.4.1" + google-protobuf "^3.14.0" + iso-language-codes "^1.0.6" + js-sha3 "^0.8.0" + latinize "^0.5.0" + long "^4.0.0" + protobufjs "^6.10.2" + tweetnacl "^1.0.3" + tweetnacl-sealedbox-js "^1.2.0" + universal-parse-url "^1.0.2" + ws "^7.1.0" + yup "^0.31.1" + +dvote-solidity@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dvote-solidity/-/dvote-solidity-1.3.1.tgz#5bb2de0c5e11e5938b97c242872e4b27cb4399b3" + integrity sha512-pC2Ik1GcYCGscBvemnFlL4t+nJAggQDeHolFnQx3EJHLb8chSmHzakrRhaaNOXsNXCO8n6frkvhH83+oZkaZVw== + dependencies: + "@openzeppelin/contracts" "^3.1.0" + eth-ens-namehash "^2.0.8" + ethers "^5.0.24" + solidity-rlp "^2.0.2" + web3-utils "^1.3.0" + dynamic-dedupe@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" @@ -8881,6 +10371,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecurve@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.0.tgz#32cfd5ce5f421e9351206a33d4e3cfd36f3465a4" + integrity sha1-Ms/Vzl9CHpNRIGoz1OPP0280ZaQ= + dependencies: + bigi "^1.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -8891,10 +10388,24 @@ ejs@^2.6.1: 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.649: - version "1.3.681" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.681.tgz#facd915ae46a020e8be566a2ecdc0b9444439be9" - integrity sha512-W6uYvSUTHuyX2DZklIESAqx57jfmGjUkd7Z3RWqLdj9Mmt39ylhBuvFXlskQnvBHj0MYXIeQI+mjiwVddZLSvA== +ejs@^3.0.1, ejs@^3.1.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-fetch@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.3.tgz#06cf363d7f64073ec00a37e9949ec9d29ce6b08a" + integrity sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw== + dependencies: + encoding "^0.1.13" + +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723: + version "1.3.726" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.726.tgz#6d3c577e5f5a48904ba891464740896c05e3bdb1" + integrity sha512-dw7WmrSu/JwtACiBzth8cuKf62NKL1xVJuNvyOg0jvruN/n4NLtGYoTzciQquCPNaS2eR+BT5GrxHbslfc/w1w== elliptic@6.3.3: version "6.3.3" @@ -8945,6 +10456,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emitter-mixin@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/emitter-mixin/-/emitter-mixin-0.0.3.tgz#5948cb286f2e48edc3b251a7cfc1f7883396d65c" + integrity sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw= + emittery@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" @@ -9004,7 +10520,27 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding@^0.1.11: +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-down@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-7.0.0.tgz#63357e0f44b4a85664d9539bd711500da70f0c63" + integrity sha512-hor6z2W/ZrVqDYMawQp7VtfEt6BrvYw+mgjWLauUMZsIBjMt1/k5aa+JreLbtjwJdkjrZ39TU+pV5GpHPGRpog== + dependencies: + abstract-leveldown "^7.0.0" + inherits "^2.0.3" + level-codec "^10.0.0" + level-errors "^3.0.0" + +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -9018,6 +10554,82 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@ 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-client@~4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-4.1.4.tgz#0bda5ba4bd87bced2ad00b93c67e133d0fb981ba" + integrity sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg== + dependencies: + base64-arraybuffer "0.1.4" + component-emitter "~1.3.0" + debug "~4.3.1" + engine.io-parser "~4.0.1" + has-cors "1.1.0" + 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" + +engine.io-parser@~4.0.0, engine.io-parser@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" + integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg== + dependencies: + base64-arraybuffer "0.1.4" + +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.4.2" + +engine.io@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" + integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + enhanced-resolve@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -9034,7 +10646,7 @@ enquirer@2.3.4: dependencies: ansi-colors "^3.2.1" -enquirer@^2.3.0, enquirer@^2.3.5: +enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -9052,14 +10664,14 @@ entities@^2.0.0: integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.3.1: - version "7.7.4" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" - integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== err-code@^1.0.0, err-code@^1.1.2: version "1.1.2" @@ -9071,13 +10683,25 @@ err-code@^2.0.0, err-code@^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== -errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: +err-code@^3.0.0, 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.2, 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" +errno@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/errno/-/errno-1.0.0.tgz#0ea47d701864accf996412f09e29b4dc2cf3856d" + integrity sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ== + 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" @@ -9092,7 +10716,7 @@ error-stack-parser@^2.0.6: 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.17.2, es-abstract@^1.17.4, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== @@ -9153,6 +10777,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-promisify@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" + integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== + 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" @@ -9166,7 +10795,7 @@ escalade@^3.0.2, escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: +escape-html@^1.0.3, 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= @@ -9193,22 +10822,40 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +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 "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -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== +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.1: + 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@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.1.0.tgz#181364895899fff9fd3605fecb5c4f20e7d5f395" + integrity sha512-zILwX9/Ocz4SV2vX7ox85AsrAgXV3f2o2gpIicdMIOra48WYqgUnWNH/cR/iHtmD2Vb3dLSC3LiEJnS05Gkw7w== dependencies: get-stdin "^6.0.0" @@ -9219,23 +10866,6 @@ eslint-config-react-app@^6.0.0: dependencies: confusing-browser-globals "^1.0.10" -eslint-config-standard-jsx@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz#314c62a0e6f51f75547f89aade059bec140edfc7" - integrity sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw== - -eslint-config-standard-react@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-9.2.0.tgz#b21f05c087c1b0cfeea9fa3bff3cf42bd08a68a9" - integrity sha512-u+KRP2uCtthZ/W4DlLWCC59GZNV/y9k9yicWWammgTs/Omh8ZUUPF3EnYm81MAcbkYQq2Wg0oxutAhi/FQ8mIw== - dependencies: - eslint-config-standard-jsx "^8.0.0" - -eslint-config-standard@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== - 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" @@ -9244,17 +10874,6 @@ eslint-import-resolver-node@^0.3.4: debug "^2.6.9" resolve "^1.13.1" -eslint-import-resolver-typescript@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.4.0.tgz#ec1e7063ebe807f0362a7320543aaed6fe1100e1" - integrity sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA== - dependencies: - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - eslint-module-utils@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" @@ -9263,23 +10882,15 @@ eslint-module-utils@^2.6.0: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - eslint-plugin-flowtype@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.3.1.tgz#df6227e28c61d967b825c1327a27818bbb2ad325" - integrity sha512-mziJD+zw+VTwLtF9qLIxYac0GJCbSEDyqMLP5ENzQeNY5EOxbAfitMFLo+UItjYOISQdh1BCobwE2d4i1o+9Rw== + version "5.7.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz#482a42fe5d15ee614652ed256d37543d584d7bc0" + integrity sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg== dependencies: lodash "^4.17.15" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.20.2, eslint-plugin-import@^2.22.1: +eslint-plugin-import@^2.22.1: version "2.22.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== @@ -9298,21 +10909,14 @@ eslint-plugin-import@^2.20.2, eslint-plugin-import@^2.22.1: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-jest@^23.13.1: - version "23.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099" - integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw== - dependencies: - "@typescript-eslint/experimental-utils" "^2.5.0" - eslint-plugin-jest@^24.1.0: - version "24.1.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.5.tgz#1e866a9f0deac587d0a3d5d7cefe99815a580de2" - integrity sha512-FIP3lwC8EzEG+rOs1y96cOJmMVpdFNreoDJv29B5vIupVssRi8zrSY3QadogT0K3h1Y8TMxJ6ZSAzYUmFCp2hg== + 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: +eslint-plugin-jsx-a11y@^6.3.1, eslint-plugin-jsx-a11y@^6.4.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== @@ -9329,61 +10933,40 @@ eslint-plugin-jsx-a11y@^6.3.1: jsx-ast-utils "^3.1.0" language-tags "^1.0.5" -eslint-plugin-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-prettier@^3.1.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" - integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== +eslint-plugin-prettier@^3.3.1: + 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-promise@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== - -eslint-plugin-react-hooks@^4.0.2, eslint-plugin-react-hooks@^4.2.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.20.0, eslint-plugin-react@^7.21.5: - version "7.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" - integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== +eslint-plugin-react@^7.21.5, eslint-plugin-react@^7.23.1: + version "7.23.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz#2d2291b0f95c03728b55869f01102290e792d494" + integrity sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + 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" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + minimatch "^3.0.4" + object.entries "^1.1.3" + object.fromentries "^2.0.4" + object.values "^1.1.3" prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" - -eslint-plugin-standard@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.4" eslint-plugin-testing-library@^3.9.2: - version "3.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.1.tgz#4dd02306d601c3238fdabf1d1dbc5f2a8e85d531" - integrity sha512-nQIFe2muIFv2oR2zIuXE4vTbcFNx8hZKRzgHZqJg8rfopIWwoTwtlbCCNELT/jXzVe1uZF68ALGYoDXjLczKiQ== + 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" @@ -9416,25 +10999,26 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + 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.2" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.2.tgz#4ee17577d6392bf72048080a1678d6237183db81" - integrity sha512-ndD9chZ/kaGnjjx7taRg7c6FK/YKb29SSYzaLtPBIYLYJQmZtuKqtQbAvTS2ymiMQT6X0VW9vZIHK0KLstv93Q== +eslint-webpack-plugin@^2.5.2: + 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: - version "7.21.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.21.0.tgz#4ecd5b8c5b44f5dedc9b8a110b01bbfeb15d1c83" - integrity sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg== + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.0" @@ -9453,7 +11037,7 @@ eslint@^7.11.0: file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^12.1.0" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -9461,7 +11045,7 @@ eslint@^7.11.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" + lodash "^4.17.21" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -9512,7 +11096,7 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= -estraverse@^4.1.1, estraverse@^4.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== @@ -9532,6 +11116,11 @@ estree-walker@^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" @@ -9542,6 +11131,18 @@ etag@~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.2.0, eth-block-tracker@^4.4.1, 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" @@ -9555,18 +11156,6 @@ eth-block-tracker@^3.0.0: pify "^2.3.0" tape "^4.6.3" -eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, 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-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" @@ -9582,7 +11171,7 @@ eth-json-rpc-errors@^1.0.1: dependencies: fast-safe-stringify "^2.0.6" -eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4.1.1, eth-json-rpc-filters@^4.2.1: +eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.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== @@ -9709,7 +11298,7 @@ eth-lib@0.2.7: elliptic "^6.4.0" xhr-request-promise "^0.1.2" -eth-lib@0.2.8, eth-lib@^0.2.8: +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== @@ -9749,6 +11338,13 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: 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" @@ -9756,10 +11352,10 @@ eth-rpc-errors@^3.0.0: dependencies: fast-safe-stringify "^2.0.6" -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== +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" @@ -10075,10 +11671,22 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.2: - version "7.0.9" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.9.tgz#2038baeb30f370a3e576ec175bd70bbbb6807d42" - integrity sha512-cRqvYYKJoitq6vMKMf8pXeVwvTrX+dRD0JwHaYqm8jvogK14tqIoCWH/KUHcRwnVxVXEYF/o6pup5jRG4V0xzg== +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.0.9: + version "7.0.10" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f" + integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw== + 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-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" @@ -10186,41 +11794,77 @@ ethers@^4.0.32: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.14, ethers@^5.0.2: - version "5.0.31" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.31.tgz#60e3b1425864fe5d2babc147ede01be8382a7d2a" - integrity sha512-zpq0YbNFLFn+t+ibS8UkVWFeK5w6rVMSvbSHrHAQslfazovLnQ/mc2gdN5+6P45/k8fPgHrfHrYvJ4XvyK/S1A== - dependencies: - "@ethersproject/abi" "5.0.12" - "@ethersproject/abstract-provider" "5.0.9" - "@ethersproject/abstract-signer" "5.0.13" - "@ethersproject/address" "5.0.10" - "@ethersproject/base64" "5.0.8" - "@ethersproject/basex" "5.0.8" - "@ethersproject/bignumber" "5.0.14" - "@ethersproject/bytes" "5.0.10" - "@ethersproject/constants" "5.0.9" - "@ethersproject/contracts" "5.0.11" - "@ethersproject/hash" "5.0.11" - "@ethersproject/hdnode" "5.0.9" - "@ethersproject/json-wallets" "5.0.11" - "@ethersproject/keccak256" "5.0.8" - "@ethersproject/logger" "5.0.9" - "@ethersproject/networks" "5.0.8" - "@ethersproject/pbkdf2" "5.0.8" - "@ethersproject/properties" "5.0.8" - "@ethersproject/providers" "5.0.23" - "@ethersproject/random" "5.0.8" - "@ethersproject/rlp" "5.0.8" - "@ethersproject/sha2" "5.0.8" - "@ethersproject/signing-key" "5.0.10" - "@ethersproject/solidity" "5.0.9" - "@ethersproject/strings" "5.0.9" - "@ethersproject/transactions" "5.0.10" - "@ethersproject/units" "5.0.10" - "@ethersproject/wallet" "5.0.11" - "@ethersproject/web" "5.0.13" - "@ethersproject/wordlists" "5.0.9" +ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.0.24: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.1.4.tgz#8ae973705ed962f8f41dc59693704002a38dd18b" + integrity sha512-EAPQ/fgGRu0PoR/VNFnHTMOtG/IZ0AItdW55C9T8ffmVu0rnyllZL404eBF66elJehOLz2kxnUrhXpE7TCpW7g== + dependencies: + "@ethersproject/abi" "5.1.2" + "@ethersproject/abstract-provider" "5.1.0" + "@ethersproject/abstract-signer" "5.1.0" + "@ethersproject/address" "5.1.0" + "@ethersproject/base64" "5.1.0" + "@ethersproject/basex" "5.1.0" + "@ethersproject/bignumber" "5.1.1" + "@ethersproject/bytes" "5.1.0" + "@ethersproject/constants" "5.1.0" + "@ethersproject/contracts" "5.1.1" + "@ethersproject/hash" "5.1.0" + "@ethersproject/hdnode" "5.1.0" + "@ethersproject/json-wallets" "5.1.0" + "@ethersproject/keccak256" "5.1.0" + "@ethersproject/logger" "5.1.0" + "@ethersproject/networks" "5.1.0" + "@ethersproject/pbkdf2" "5.1.0" + "@ethersproject/properties" "5.1.0" + "@ethersproject/providers" "5.1.2" + "@ethersproject/random" "5.1.0" + "@ethersproject/rlp" "5.1.0" + "@ethersproject/sha2" "5.1.0" + "@ethersproject/signing-key" "5.1.0" + "@ethersproject/solidity" "5.1.0" + "@ethersproject/strings" "5.1.0" + "@ethersproject/transactions" "5.1.1" + "@ethersproject/units" "5.1.0" + "@ethersproject/wallet" "5.1.0" + "@ethersproject/web" "5.1.0" + "@ethersproject/wordlists" "5.1.0" + +ethers@^5.4.1: + 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" ethjs-unit@0.1.6: version "0.1.6" @@ -10238,16 +11882,16 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + 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== -eventemitter3@3.1.2, eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - eventemitter3@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" @@ -10258,20 +11902,25 @@ eventemitter3@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.7, eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +events@^3.0.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.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== dependencies: original "^1.0.0" @@ -10284,9 +11933,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + 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@^1.0.0: version "1.0.0" @@ -10317,7 +11966,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.0, execa@^4.0.3: +execa@^4.0.0, execa@^4.0.3, execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -10332,6 +11981,26 @@ execa@^4.0.0, execa@^4.0.3: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +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" @@ -10458,11 +12127,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-files@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" - integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -10495,6 +12159,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.0.0.tgz#9bc72e6860347bb045a876d1c5c0af11e9b984e7" + integrity sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ== + fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -10534,6 +12203,16 @@ fast-safe-stringify@^2.0.6: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== +fast-write-atomic@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz#7ee8ef0ce3c1f531043c09ae8e5143361ab17ede" + integrity sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw== + +fastfile@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.1.tgz#bf12427f476d32220c45d890529df00347a61eb1" + integrity sha512-Fk8PWafGWGEUw7oPq/dJen92ASxknCEy4ZC8n4VEvSwCp/jcReyEmVoWsRIWTf+IvAp2MzvFi54vOPeK2LQZtQ== + fastq@^1.6.0: version "1.11.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" @@ -10541,14 +12220,7 @@ fastq@^1.6.0: 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: +faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== @@ -10569,6 +12241,37 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" +ffiasm@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ffiasm/-/ffiasm-0.0.2.tgz#2445ae08d0d78369312eb394129440731f73b364" + integrity sha512-o/CL7F4IodB7eRHCOQL1SrqN2DIPHrQbEwjPY7NIyeBRdnB3G0xo6b6Mj44SKiWFnvpQMb3n4N7acjD3vv4NVQ== + dependencies: + big-integer "^1.6.48" + ejs "^3.0.1" + yargs "^15.3.1" + +ffjavascript@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.0.3.tgz#4f3f91ae02a9fedaed0bd1fae4c54709dc029250" + integrity sha512-uXbiC7cNbFzNJCdkGlbQf2d7GciY1ICMcBeAA7+D8RHPr9Y5zYiDRWtU5etjAV8TplE7eZQ9Iqd9ieFi0ARJLA== + dependencies: + big-integer "^1.6.48" + +ffjavascript@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.1.0.tgz#456256c259654cc1ce864c6762b0e76ee1714100" + integrity sha512-dmKlUasSfvUcxBm8nCSKl2x7EFJsXA7OVP8XLFA03T2+6mAc3IiVLC2ambEVOcMOhyhl0vJfVZjM9f9d38D1rw== + dependencies: + big-integer "^1.6.48" + +ffwasm@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/ffwasm/-/ffwasm-0.0.6.tgz#ec9a16e92b820ffb1cd8871b4237fe90db45e704" + integrity sha512-bEBKYANozdyZBCGE6XLg4s/CaJRZdFGQgbthy7EZ4OhNCIpycgklS5mlf88Bw4fXSddlU1V9iYXI4JwfGO3BhQ== + dependencies: + big-integer "^1.6.48" + wasmbuilder "0.0.10" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -10581,6 +12284,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -10596,11 +12306,27 @@ file-loader@6.1.1: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-type@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.0.tgz#16a2626f3b33bac612f6e81e52216f3a7c8e12a2" + integrity sha512-OxgWA9tbL8N/WP00GD1z8O0MiwQKFyWRs1q+3FhjdvcGgKqwxcejyGWso3n4/IMU6DdwV+ARZ4A7TTnPkDcSiw== + dependencies: + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.0.3" + token-types "^2.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== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + filesize@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" @@ -10705,6 +12431,13 @@ find-yarn-workspace-root@^1.2.1: 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" @@ -10755,6 +12488,16 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" +fnv-plus@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67" + integrity sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw== + +fnv1a@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fnv1a/-/fnv1a-1.0.1.tgz#915e2d6d023c43d5224ad9f6d2a3c4156f5712f5" + integrity sha1-kV4tbQI8Q9UiStn20qPEFW9XEvU= + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -10763,9 +12506,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0, follow-redirects@^1.10.0, follow-redirects@^1.12.1: - version "1.13.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + version "1.14.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.0.tgz#f5d260f95c5f8c105894491feee5dc8993b402fe" + integrity sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" @@ -10811,6 +12554,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + 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" @@ -10980,11 +12732,26 @@ function-bind@^1.1.1, function-bind@~1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.4.tgz#e4ea839b9d3672ae99d0efd9f38d9191c5eaac83" + integrity sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + functions-have-names "^1.2.2" + 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= +functions-have-names@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" + integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + ganache-cli@^6.11.0: version "6.12.2" resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" @@ -10994,7 +12761,7 @@ ganache-cli@^6.11.0: source-map-support "0.5.12" yargs "13.2.4" -ganache-core@^2.10.2: +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== @@ -11045,6 +12812,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -11055,12 +12829,17 @@ gensync@^1.0.0-beta.1, gensync@^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.0.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: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: 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== @@ -11079,6 +12858,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + 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" @@ -11134,6 +12918,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + 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" @@ -11217,9 +13006,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + 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" @@ -11251,7 +13040,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.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: +glob@^7.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.1, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -11299,6 +13088,13 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + 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" @@ -11331,9 +13127,9 @@ globby@^10.0.1: slash "^3.0.0" globby@^11.0.1: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -11342,6 +13138,18 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -11367,6 +13175,15 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" +globule@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + gluegun@^4.3.1: version "4.6.1" resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-4.6.1.tgz#f2a65d20378873de87a2143b8c3939ffc9a9e2b6" @@ -11404,6 +13221,11 @@ gluegun@^4.3.1: which "^2.0.0" yargs-parser "^16.1.0" +google-protobuf@^3.14.0: + version "3.15.8" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.8.tgz#5f3948905e4951c867d6bc143f385a80e2a39efe" + integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -11441,40 +13263,33 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graphql-extensions@^0.12.8: - version "0.12.8" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.8.tgz#9cdc2c43d8fe5e0f6c3177a004ac011da2a8aa0f" - integrity sha512-xjsSaB6yKt9jarFNNdivl2VOx52WySYhxPgf8Y16g6GKZyAzBoIFiwyGw5PJDlOSUa6cpmzn6o7z8fVMbSAbkg== - dependencies: - "@apollographql/apollo-tools" "^0.4.3" - apollo-server-env "^3.0.0" - apollo-server-types "^0.6.3" - -graphql-request@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.4.0.tgz#3a400cd5511eb3c064b1873afb059196bbea9c2b" - integrity sha512-acrTzidSlwAj8wBNO7Q/UQHS8T+z5qRGquCQRv9J1InwR01BBWV9ObnoE+JS5nCCEj8wSGS0yrDXVDoRiKZuOg== +graphql-extensions@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.14.0.tgz#cddf2fd43168e18be1d0e9057a4b3647febdd35f" + integrity sha512-DFtD8G+6rSj/Xhtb0IPh4A/sB/qcSEm9MTS221ESCx+axrsME92wGEsr7ihVjn1/tEEIy+9V5lUQOH/dHkCb0A== dependencies: - cross-fetch "^3.0.6" - extract-files "^9.0.0" - form-data "^3.0.0" + "@apollographql/apollo-tools" "^0.5.0" + apollo-server-env "^3.1.0" + apollo-server-types "^0.8.0" graphql-subscriptions@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.2.0.tgz#d82ff76e7504ac91acbbea15f36cd3904043937b" - integrity sha512-uXvp729fztqwa7HFUFaAqKwNMwwOfsvu4HwOu7/35Cd44bNrMPCn97mNGN0ybuuZE36CPXBTaW/4U/xyOS4D9w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz#2142b2d729661ddf967b7388f7cf1dd4cf2e061d" + integrity sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g== dependencies: iterall "^1.3.0" -graphql-tag@^2.10.3, graphql-tag@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" - integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== +graphql-tag@^2.10.3, graphql-tag@^2.11.0, graphql-tag@^2.12.0: + version "2.12.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.4.tgz#d34066688a4f09e72d6f4663c74211e9b4b7c4bf" + integrity sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww== + dependencies: + tslib "^2.1.0" graphql-tools@^4.0.8: version "4.0.8" @@ -11494,7 +13309,7 @@ graphql@^14.0.2: dependencies: iterall "^1.2.2" -graphql@^15.0.0, graphql@^15.3.0, graphql@^15.4.0: +graphql@^15.3.0, graphql@^15.4.0, graphql@^15.5.0: version "15.5.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== @@ -11509,6 +13324,11 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gzip-size@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -11517,6 +13337,21 @@ gzip-size@5.1.1: duplexer "^0.1.1" pify "^4.0.1" +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +hamt-sharding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hamt-sharding/-/hamt-sharding-2.0.0.tgz#1b11f1ce8788074f9a75cdc25090600e4773cfa7" + integrity sha512-h8HKkMrqX6UC7I8hYRA1BT8pSC1TV1+V9HolGyWiNKRIztMQ980vWwjWZSLPFHtUKGMtOVBSVz5lIXuvlzwlWQ== + dependencies: + sparse-array "^1.3.1" + uint8arrays "^2.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -11553,25 +13388,25 @@ hard-rejection@^2.1.0: integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== hardhat-abi-exporter@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.1.2.tgz#7f0aa1fc91d546ca595ca35b743e36211a71f987" - integrity sha512-ovJr6zJ9uxHDZmqtRRfaaFA8KxVCNzfHroP44QOWZ+CAh06hSen3r4Qehw6u7Vl5xJmw7Pu7nz+7q5QvPWXTKA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.2.1.tgz#98ad242d08987d34416c6315729f36f9d544e4fa" + integrity sha512-Um7+RPvJEj+OqWjPoPKlTTkO1Akr10pqpgMk8Pw2jz2wrGv5XQBGNW5aQgGVDUosYktUIWDaEhcwwFKbFsir9A== -hardhat-deploy@^0.7.0-beta.37: - version "0.7.0-beta.46" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.0-beta.46.tgz#6caa34a534e7d40e0f2d98a26b90e154d5004e1b" - integrity sha512-VADqekd40MYHWVQxz3jn+C7Vtfv7qPboZZYH7N8wLtPU/ZcGvEQRgB4LBkOeuwQd/80MIXwSBOrnN4x6LjIauA== - dependencies: - "@ethersproject/abi" "^5.0.2" - "@ethersproject/abstract-signer" "^5.0.2" - "@ethersproject/address" "^5.0.2" - "@ethersproject/bignumber" "^5.0.5" - "@ethersproject/bytes" "^5.0.2" - "@ethersproject/contracts" "^5.0.2" - "@ethersproject/providers" "^5.0.5" - "@ethersproject/solidity" "^5.0.2" - "@ethersproject/transactions" "^5.0.2" - "@ethersproject/wallet" "^5.0.2" +hardhat-deploy@^0.7.2: + version "0.7.5" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.5.tgz#d31edcca709e9a8314efeaecb9a35792c295bc77" + integrity sha512-b+raIZBhrlw3lzkj7La8wyfczgxRsSWo8IHQM4STY4VUw0I/zjjeMm1naIvtGuebdrW/63ADLsucXZUZ8yVLkQ== + dependencies: + "@ethersproject/abi" "^5.0.0" + "@ethersproject/abstract-signer" "^5.0.0" + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/contracts" "^5.0.0" + "@ethersproject/providers" "^5.0.0" + "@ethersproject/solidity" "^5.0.0" + "@ethersproject/transactions" "^5.0.0" + "@ethersproject/wallet" "^5.0.0" "@types/qs" "^6.9.4" axios "^0.21.1" chalk "^4.1.0" @@ -11589,14 +13424,18 @@ hardhat-typechain@^0.3.3: integrity sha512-w9lm8sxqTJACY+V7vijiH+NkPExnmtiQEjsV9JKD1KgMdVk2q8y+RhvU/c4B7+7b1+HylRUCxpOIvFuB3rE4+w== hardhat@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.1.1.tgz#bcfed980019672b57011845a1678f714728d6ee7" - integrity sha512-55XMqB5QoeRg3m56rBg0NQgU//GPqOC9t4RbRSU3pdBJGHGXFTUh8fjTPxnWJNu9r72Zju++syGcCkPGwftyvw== - dependencies: - "@nomiclabs/ethereumjs-vm" "4.2.2" + version "2.2.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.2.1.tgz#bef0031b994e3f60a88d428f2097195c58cf9ed2" + integrity sha512-8s7MtGXdh0NDwQKdlA8m8QdloVIN1+hv5aFpn0G5Ljj9vfNY9kUoc0a9pMboeGbd9WrS+XrZs5YlsPgQjaW/Tg== + dependencies: + "@ethereumjs/block" "^3.2.1" + "@ethereumjs/blockchain" "^5.2.1" + "@ethereumjs/common" "^2.2.0" + "@ethereumjs/tx" "^3.1.3" + "@ethereumjs/vm" "^5.3.2" "@sentry/node" "^5.18.1" "@solidity-parser/parser" "^0.11.0" - "@types/bn.js" "^4.11.5" + "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" adm-zip "^0.4.16" @@ -11610,11 +13449,7 @@ hardhat@^2.1.1: eth-sig-util "^2.5.2" ethereum-cryptography "^0.1.2" 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.0" + ethereumjs-util "^7.0.10" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" @@ -11622,7 +13457,7 @@ hardhat@^2.1.1: immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "3.0.0" + merkle-patricia-tree "^4.1.0" mnemonist "^0.38.0" mocha "^7.1.2" node-fetch "^2.6.0" @@ -11640,9 +13475,9 @@ hardhat@^2.1.1: ws "^7.2.1" harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + 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" @@ -11651,11 +13486,23 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -11748,7 +13595,7 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +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== @@ -11756,12 +13603,17 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hashlru@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" + integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== + he@1.2.0, 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: +heap@0.2.6, heap@~0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= @@ -11772,9 +13624,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== hi-base32@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.0.tgz#61329f76a31f31008533f1c36f2473e259d64571" - integrity sha512-DDRmxSyoYuvjUb9EnXdoiMChBZ7ZcUVJsK5Frd3kqMhuBxvmZdnBeynAVfj7/ECbn++CekcoprvC/rprHPAtow== + 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== history@^4.9.0: version "4.10.1" @@ -11797,7 +13649,7 @@ hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, 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== @@ -11818,14 +13670,14 @@ hoopy@^0.1.4: integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + 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== -hosted-git-info@^3.0.6: - version "3.0.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== dependencies: lru-cache "^6.0.0" @@ -11849,11 +13701,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - 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" @@ -12041,6 +13888,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -12048,6 +13900,21 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +husky@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-5.2.0.tgz#fc5e1c2300d34855d47de4753607d00943fc0802" + integrity sha512-AM8T/auHXRBxlrfPVLKP6jt49GCM2Zz47m8G3FOMsLmTv8Dj/fKVWE0Rh2d4Qrvmy131xEsdQnb3OXRib67PGg== + +husky@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" + integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -12083,7 +13950,7 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13, ieee754@^1.1.4: +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== @@ -12125,6 +13992,11 @@ immer@8.0.1: resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== +immer@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.2.tgz#83e4593df9914acaecfd9fac6a8601ef44d883fc" + integrity sha512-mkcmzLtIfSp40vAqteRr1MbWNSoI7JE+/PB36FNPoSfJ9RQRmNKuTYCjKkyXyuq3Dgn07HuJBrwJd4ZSk2yUbw== + immutable@^3.8.2: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -12191,6 +14063,13 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indefinite-observable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400" + integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== + dependencies: + symbol-observable "1.2.0" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -12213,6 +14092,11 @@ indexes-of@^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" @@ -12279,6 +14163,30 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" +interface-datastore@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-4.0.1.tgz#bf549b4352bce3581a762625a5b58e0c9e0df953" + integrity sha512-Q2zh5jGWzLylee1wuT/aSi0aqy4mW7ePlWhfzoISRZ+Uoz3Vq8WksC4og/Sq4Au6p2ujNRlwMO9VjwrQ48HYYw== + dependencies: + err-code "^3.0.1" + ipfs-utils "^7.0.0" + iso-random-stream "^2.0.0" + it-all "^1.0.2" + it-drain "^1.0.1" + it-filter "^1.0.2" + it-take "^1.0.1" + nanoid "^3.0.2" + uint8arrays "^2.1.5" + +interface-ipld-format@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/interface-ipld-format/-/interface-ipld-format-1.0.0.tgz#8cd9b37363a3b7aee0b109f4fa55e89af31e20f8" + integrity sha512-/df/uHRUxE9LtTJaC1QAwgmHUjdVxvCvQKQLoMo2k4Ilu3uSob5vNmZqXXnuQQM4M5tZjyRbqMm+A+hvWbki8w== + dependencies: + cids "^1.1.6" + multicodec "^3.0.1" + multihashes "^4.0.2" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -12325,12 +14233,20 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ip-address@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-7.1.0.tgz#4a9c699e75b51cbeb18b38de8ed216efa1a490c5" + integrity sha512-V9pWC/VJf2lsXqP7IWJ+pe3P1/HCYGBMZrrnT62niLGjAfCbeiwXMUxaeHvnVlz19O27pvXP4azs+Pj/A0x+SQ== + dependencies: + jsbn "1.1.0" + sprintf-js "1.1.2" + 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: +ip-regex@^4.0.0, ip-regex@^4.3.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== @@ -12345,6 +14261,42 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipfs-bitswap@^5.0.3: + version "5.0.5" + resolved "https://registry.yarnpkg.com/ipfs-bitswap/-/ipfs-bitswap-5.0.5.tgz#9c4d487d01d5c43cedc43ea1d3af73324b034992" + integrity sha512-y9tZqT3gSEV5fKK8xONCQ9A4/Z3X4i5Y2G6nJmc3dG+WqYEhz+FHrsoFkmdOsPL+/WvBqRv+9GfeqFc7A0Fm5w== + dependencies: + "@vascosantos/moving-average" "^1.1.0" + abort-controller "^3.0.0" + any-signal "^2.1.2" + cids "^1.1.6" + debug "^4.2.0" + ipld-block "^0.11.0" + it-length-prefixed "^5.0.2" + it-pipe "^1.1.0" + just-debounce-it "^1.1.0" + libp2p-interfaces "^0.10.0" + multiaddr "^9.0.1" + multicodec "^3.0.1" + multihashing-async "^2.1.2" + native-abort-controller "^1.0.3" + process "^0.11.10" + protobufjs "^6.10.2" + readable-stream "^3.6.0" + streaming-iterables "^5.0.4" + uint8arrays "^2.1.3" + url "^0.11.0" + util "^0.12.3" + varint-decoder "^1.0.0" + +ipfs-block-service@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/ipfs-block-service/-/ipfs-block-service-0.19.0.tgz#402130019370c5f132a3aea5dcb7735f3ea6c2e9" + integrity sha512-jFcGoIQ9uXQADq5PIOMztaPks7UBOj2maTPyUNiZDy4VbjpZAz512jy8XUT0GQZ3IClMknQBUavFEwtyMbpzMg== + dependencies: + err-code "^3.0.1" + it-map "^1.0.5" + ipfs-block@~0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ipfs-block/-/ipfs-block-0.8.1.tgz#05e1068832775e8f1c2da5b64106cc837fd2acb9" @@ -12353,6 +14305,142 @@ ipfs-block@~0.8.1: cids "~0.7.0" class-is "^1.1.0" +ipfs-core-types@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.4.0.tgz#ccda075b22305e096c3e74698baa9b9e7d5f7dce" + integrity sha512-K0bodmABbqgybO0oHkFSbQoYoYlX7P4/DMdCcAZzUAPRD/ht7qF8ZcRLCdZhmkxDBeM5jgz4eGF+eLM5xMVNfw== + dependencies: + cids "^1.1.6" + interface-datastore "^4.0.0" + ipld-block "^0.11.1" + multiaddr "^9.0.1" + multibase "^4.0.2" + +ipfs-core-types@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.5.0.tgz#c5775f249e586a7c2e029b5ed2d73bcc548abb2d" + integrity sha512-Upd++4T3beEijnegundRgjSaKsyjqzyf9gmKZHy47rRetObC6trJZALvp5VBpiR0cQXoFEegcXpVOuC/om/4pw== + dependencies: + cids "^1.1.6" + interface-datastore "^4.0.0" + ipld-block "^0.11.1" + multiaddr "^9.0.1" + multibase "^4.0.2" + +ipfs-core-utils@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.8.0.tgz#6bed0616ed01ba2a3ce456393666f1965baf600a" + integrity sha512-VT+QwQo83ZQSYy8UW03UXpJ7ry85CVf4OWXgG6g05CpCpBGlKsJovfe1ZDM65kWh1U2pFx4IXpva7qd+DRiXPw== + dependencies: + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + cids "^1.1.6" + err-code "^3.0.1" + ipfs-core-types "^0.4.0" + ipfs-unixfs "^4.0.3" + ipfs-utils "^7.0.0" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.1" + multiaddr "^9.0.1" + multiaddr-to-uri "^7.0.0" + parse-duration "^1.0.0" + timeout-abort-controller "^1.1.1" + uint8arrays "^2.1.3" + +ipfs-core-utils@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.8.1.tgz#46b8d530ad1f0577b4df185fe5869425db4e2e40" + integrity sha512-25InaceHlXNHzfoWGGtzv8jhq6/anPOJonCoxh2QlcqCNJS1NcrHgboTmMShMhWz9/67Pd0VMaku356Pou/smw== + dependencies: + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + cids "^1.1.6" + err-code "^3.0.1" + ipfs-core-types "^0.5.0" + ipfs-unixfs "^4.0.3" + ipfs-utils "^7.0.0" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.1" + multiaddr "^9.0.1" + multiaddr-to-uri "^7.0.0" + parse-duration "^1.0.0" + timeout-abort-controller "^1.1.1" + uint8arrays "^2.1.3" + +ipfs-core@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/ipfs-core/-/ipfs-core-0.6.1.tgz#8d5e0603b396ffff7b794f8f7659e65290913fc1" + integrity sha512-StsMUOm8ZKsTddKM2vGYReZVcgL0Nd8eR4MkNp+l+lpbv/O3/vtYRcJP3j1o4iq3wNTm1FLdWWAsZ/Au/qC6rA== + dependencies: + abort-controller "^3.0.0" + array-shuffle "^2.0.0" + cborg "^1.2.1" + cids "^1.1.6" + dag-cbor-links "^2.0.0" + datastore-core "^4.0.0" + datastore-pubsub "^0.6.1" + debug "^4.1.1" + dlv "^1.1.3" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + hashlru "^2.3.0" + interface-datastore "^4.0.0" + ipfs-bitswap "^5.0.3" + ipfs-block-service "^0.19.0" + ipfs-core-types "^0.4.0" + ipfs-core-utils "^0.8.0" + ipfs-repo "^9.1.6" + ipfs-unixfs "^4.0.3" + ipfs-unixfs-exporter "^5.0.3" + ipfs-unixfs-importer "^7.0.3" + ipfs-utils "^7.0.0" + ipld "^0.30.0" + ipld-block "^0.11.0" + ipld-dag-cbor "^1.0.0" + ipld-dag-pb "^0.22.1" + ipld-raw "^7.0.0" + ipns "^0.11.0" + is-domain-name "^1.0.1" + is-ipfs "^5.0.0" + it-all "^1.0.4" + it-drain "^1.0.3" + it-first "^1.0.4" + it-last "^1.0.4" + it-map "^1.0.4" + it-pipe "^1.1.0" + just-safe-set "^2.2.1" + libp2p "^0.31.2" + libp2p-bootstrap "^0.12.3" + libp2p-crypto "^0.19.3" + libp2p-floodsub "^0.25.1" + libp2p-gossipsub "^0.9.0" + libp2p-kad-dht "^0.22.0" + libp2p-mdns "^0.16.0" + libp2p-mplex "^0.10.2" + libp2p-noise "^3.0.0" + libp2p-record "^0.10.3" + libp2p-tcp "^0.15.4" + libp2p-webrtc-star "^0.22.2" + libp2p-websockets "^0.15.6" + mafmt "^9.0.0" + merge-options "^3.0.4" + mortice "^2.0.0" + multiaddr "^9.0.1" + multiaddr-to-uri "^7.0.0" + multibase "^4.0.2" + multicodec "^3.0.1" + multihashing-async "^2.1.2" + native-abort-controller "^1.0.3" + p-queue "^6.6.1" + parse-duration "^1.0.0" + peer-id "^0.14.1" + streaming-iterables "^5.0.2" + uint8arrays "^2.1.3" + 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" @@ -12410,6 +14498,150 @@ ipfs-http-client@^34.0.0: tar-stream "^2.0.1" through2 "^3.0.1" +ipfs-http-client@^50.1.0: + version "50.1.0" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-50.1.0.tgz#5177553029a7c32f1c6be3eb1d91fab0d71ae437" + integrity sha512-w7zWRugPR9dm4TS/rshtwycjwGZkxk9AXHV1a8OoVYZHEi5BvHD+kp5PdskfrfJ2rBtnWEo3qo2OoIpBe2rxxQ== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.2" + cids "^1.1.6" + debug "^4.1.1" + form-data "^4.0.0" + ipfs-core-types "^0.5.0" + ipfs-core-utils "^0.8.1" + ipfs-unixfs "^4.0.3" + ipfs-utils "^7.0.0" + ipld-block "^0.11.0" + ipld-dag-cbor "^1.0.0" + ipld-dag-pb "^0.22.1" + ipld-raw "^7.0.0" + it-last "^1.0.4" + it-map "^1.0.4" + it-tar "^3.0.0" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiaddr "^9.0.1" + multibase "^4.0.2" + multicodec "^3.0.1" + multihashes "^4.0.2" + nanoid "^3.1.12" + native-abort-controller "^1.0.3" + parse-duration "^1.0.0" + stream-to-it "^0.2.2" + uint8arrays "^2.1.3" + +ipfs-repo-migrations@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ipfs-repo-migrations/-/ipfs-repo-migrations-8.0.0.tgz#5ab4c4320877c495b6668e8db04569c32767286a" + integrity sha512-Oy16XX33LZG7EqddpyR/bx1G7AXaUsObFZrKc3R6/24EmyCl75LEQs/ADLcK3ArteSI+KnL3tg+Ph2SbYNXuiQ== + dependencies: + cborg "^1.0.4" + cids "^1.0.0" + datastore-core "^4.0.0" + debug "^4.1.0" + fnv1a "^1.0.1" + interface-datastore "^4.0.0" + ipld-dag-pb "^0.22.1" + it-length "^1.0.1" + multibase "^4.0.1" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + proper-lockfile "^4.1.1" + protobufjs "^6.10.2" + uint8arrays "^2.0.5" + varint "^6.0.0" + +ipfs-repo@^9.1.6: + version "9.1.6" + resolved "https://registry.yarnpkg.com/ipfs-repo/-/ipfs-repo-9.1.6.tgz#0d9b372fe92328013415e1676b28777269a41869" + integrity sha512-tNr1DtZh4QAlMU96JUh6esGJRRkJETnsNO+cy1ej0l5jTpQ56S0ndb/+6Eu4wHxIHadPsjDFQNojZbluSy07Tg== + dependencies: + bytes "^3.1.0" + cids "^1.1.6" + datastore-core "^4.0.0" + datastore-fs "^4.0.0" + datastore-level "^5.0.0" + debug "^4.1.0" + err-code "^3.0.1" + interface-datastore "^4.0.0" + ipfs-repo-migrations "^8.0.0" + ipfs-utils "^7.0.0" + ipld-block "^0.11.0" + it-filter "^1.0.2" + it-map "^1.0.2" + it-pushable "^1.4.0" + just-safe-get "^2.0.0" + just-safe-set "^2.1.0" + merge-options "^3.0.4" + multibase "^4.0.1" + multihashes "^4.0.2" + p-queue "^6.0.0" + proper-lockfile "^4.0.0" + sort-keys "^4.0.0" + uint8arrays "^2.1.3" + +ipfs-unixfs-exporter@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-5.0.3.tgz#c5e62c745dda333a8a43b9830ffe1acc4df3fbbd" + integrity sha512-bKlDCCQkAvj8NYwpUyHdCv/Et1Pyk4VowB8fPusbYNSVlwikoBVac43XXrDlDhzPOQhNKTIGK2C7FnX1KC94vA== + dependencies: + cids "^1.1.5" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + ipfs-unixfs "^4.0.3" + it-last "^1.0.5" + multihashing-async "^2.1.0" + +ipfs-unixfs-importer@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz#b850e831ca9647d589ef50bc33421f65bab7bba6" + integrity sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ== + dependencies: + bl "^5.0.0" + cids "^1.1.5" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + ipfs-unixfs "^4.0.3" + ipld-dag-pb "^0.22.2" + it-all "^1.0.5" + it-batch "^1.0.8" + it-first "^1.0.6" + it-parallel-batch "^1.0.9" + merge-options "^3.0.4" + multihashing-async "^2.1.0" + rabin-wasm "^0.1.4" + uint8arrays "^2.1.2" + +ipfs-unixfs@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz#7c43e5726052ade4317245358ac541ef3d63d94e" + integrity sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw== + dependencies: + err-code "^3.0.1" + protobufjs "^6.10.2" + +ipfs-utils@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-7.0.0.tgz#8c1e2dc04af749e781230efc6ead7bfebe577dce" + integrity sha512-25Nj95cPcLVYROCk3vtfqQ30HBzsmgLjy6YlHkYbub4uO1JBKzP2gJMBFLfRPOfLGzT+0rYOCpWjnbYqDDxqIA== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.0.0" + it-glob "~0.0.11" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-abort-controller "^1.0.3" + native-fetch "^3.0.0" + node-fetch "^2.6.1" + stream-to-it "^0.2.2" + ipfs-utils@~0.0.3: version "0.0.4" resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-0.0.4.tgz#946114cfeb6afb4454b4ccb10d2327cd323b0cce" @@ -12423,6 +14655,38 @@ ipfs-utils@~0.0.3: kind-of "^6.0.2" readable-stream "^3.4.0" +ipld-block@^0.11.0, ipld-block@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" + integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== + dependencies: + cids "^1.0.0" + +ipld-dag-cbor@^0.17.0: + version "0.17.1" + resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" + integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== + dependencies: + borc "^2.1.2" + cids "^1.0.0" + is-circular "^1.0.2" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + uint8arrays "^2.1.3" + +ipld-dag-cbor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-1.0.0.tgz#329f84904e00a99cdebd6a03e972583af3d5d4d1" + integrity sha512-ViDkqpBDW10TTqFU23NC/eIbu0kuaD3QPTAFDu95mvei0zKu67c/Z2eTh5A0inBXSSvNZ23wzVkUinvxVfrDyw== + dependencies: + borc "^3.0.0" + cids "^1.0.0" + interface-ipld-format "^1.0.0" + is-circular "^1.0.2" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + uint8arrays "^2.1.3" + 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" @@ -12435,6 +14699,19 @@ ipld-dag-cbor@~0.15.0: multicodec "^1.0.0" multihashing-async "~0.8.0" +ipld-dag-pb@^0.22.0, ipld-dag-pb@^0.22.1, ipld-dag-pb@^0.22.2: + version "0.22.2" + resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.22.2.tgz#a8c6a9744b7083fe8a0f6abc1c19a1534d6d1e37" + integrity sha512-5ZPo+hmH4YnPx0FIsJsWZFG9g8hCA5Oy0eGLA4lOPE6h1JHzn6VxnWoVkA22ft0i4koOuKNUqAXpepAKyf9rrw== + dependencies: + cids "^1.0.0" + interface-ipld-format "^1.0.0" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + protobufjs "^6.10.2" + stable "^0.1.8" + uint8arrays "^2.0.5" + 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" @@ -12456,6 +14733,49 @@ ipld-raw@^4.0.0: multicodec "^1.0.0" multihashing-async "~0.8.0" +ipld-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-7.0.0.tgz#221fe0ad67c2734b0bc85186707218bc4c908587" + integrity sha512-24v84ORBQO5NVYSTHfYnJX4AIX4lQzIIL98au5fmMEwkS+gjGUrw7SqQaN0oTzIuVcJFpDbH5gEbS+x3AnW1hQ== + dependencies: + cids "^1.1.6" + interface-ipld-format "^1.0.0" + multicodec "^3.0.1" + multihashing-async "^2.1.2" + +ipld@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/ipld/-/ipld-0.30.0.tgz#65e311723f98d6365873cdeeeae219eca2f4697b" + integrity sha512-cW52j8xyHEoMf0jmbmVDTnmDG+w+ymb1048rLN6eLoJ4FPPWQdNSJuFlHnWdlbYrz25V9kHbpkeI4YYhK0wjJg== + dependencies: + cids "^1.1.6" + interface-ipld-format "^1.0.0" + ipfs-block-service "^0.19.0" + ipld-block "^0.11.1" + ipld-dag-cbor "^1.0.0" + ipld-dag-pb "^0.22.0" + ipld-raw "^7.0.0" + merge-options "^3.0.4" + multicodec "^3.0.1" + multihashes "^4.0.2" + typical "^6.0.1" + +ipns@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/ipns/-/ipns-0.11.0.tgz#47cfd0470ab73b864ff0401d924fa1f5a10925b7" + integrity sha512-HAXwroC6WGzat41DKtF+az3hGGoE3mHRNaFAeZnEwSy/m9zhdjjeDddNcGIG8mKu/E2mo4FlMJSFT3chaBcaMw== + dependencies: + debug "^4.2.0" + err-code "^3.0.1" + interface-datastore "^4.0.0" + libp2p-crypto "^0.19.0" + multibase "^4.0.2" + multihashes "^4.0.2" + peer-id "^0.14.2" + protobufjs "^6.10.2" + timestamp-nano "^1.0.0" + uint8arrays "^2.0.5" + 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" @@ -12533,7 +14853,7 @@ is-buffer@^1.1.5: 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: +is-buffer@^2.0.2, is-buffer@^2.0.3, is-buffer@^2.0.5, 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== @@ -12568,9 +14888,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.0.0, is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" + integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== dependencies: has "^1.0.3" @@ -12617,9 +14937,14 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-domain-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-domain-name/-/is-domain-name-1.0.1.tgz#f6eb33b14a497541dca58335137d4466e0c20da1" + integrity sha1-9uszsUpJdUHcpYM1E31EZuDCDaE= is-electron@^2.2.0: version "2.2.0" @@ -12704,6 +15029,11 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -12723,18 +15053,18 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" -is-ipfs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-2.0.0.tgz#c046622e4daf5435b671aeb9739a832107e06805" - integrity sha512-X4Cg/JO+h/ygBCrIQSMgicHRLo5QpB+i5tHLhFgGBksKi3zvX6ByFCshDxNBvcq4NFxF3coI2AaLqwzugNzKcw== - dependencies: - cids "^1.0.0" - iso-url "~0.4.7" - mafmt "^8.0.0" - multiaddr "^8.0.0" - multibase "^3.0.0" - multihashes "^3.0.1" - uint8arrays "^1.1.0" +is-ipfs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-5.0.0.tgz#7f884d14155dd85beb6e6e1f8a8b1b334eb95896" + integrity sha512-mDH7JWGLMAtDAtPtgzdAxk1YZzk88pLmhqo2f0EfgHrIOZb4xfkczBCjk4N+ibnX+QYTxHol9i3tBTOj+g+OUQ== + dependencies: + cids "^1.1.6" + iso-url "^1.1.3" + mafmt "^9.0.0" + multiaddr "^9.0.1" + multibase "^4.0.2" + multihashes "^4.0.2" + uint8arrays "^2.1.3" is-ipfs@~0.6.1: version "0.6.3" @@ -12748,6 +15078,11 @@ is-ipfs@~0.6.1: multibase "~0.6.0" multihashes "~0.4.13" +is-loopback-addr@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-loopback-addr/-/is-loopback-addr-1.0.1.tgz#d4adf50d12d53100da62a397c61d6c83fe40aab9" + integrity sha512-DhWU/kqY7X2F6KrrVTu7mHlbd2Pbo4D1YkAzasBMjQs6lJAoefxaA6m6CpSX0K6pjt9D0b9PNFI5zduy/vzOYw== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -12790,11 +15125,23 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + 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" @@ -12802,6 +15149,13 @@ is-path-in-cwd@^2.0.0: dependencies: is-path-inside "^2.1.0" +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + 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" @@ -12814,6 +15168,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + 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" @@ -12827,9 +15186,9 @@ is-plain-object@^5.0.0: integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + 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" @@ -12841,7 +15200,14 @@ is-pull-stream@0.0.0: resolved "https://registry.yarnpkg.com/is-pull-stream/-/is-pull-stream-0.0.0.tgz#a3bc3d1c6d3055151c46bde6f399efed21440ca9" integrity sha1-o7w9HG0wVRUcRr3m85nv7SFEDKk= -is-regex@^1.0.4, is-regex@^1.1.2: +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.0, is-regex@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== @@ -12905,13 +15271,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -12949,6 +15308,11 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -12986,6 +15350,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~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" @@ -12996,12 +15365,30 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +iso-constants@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" + integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== + +iso-language-codes@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/iso-language-codes/-/iso-language-codes-1.0.8.tgz#e4410b06752f15a800135d3be4dbfe4e4bc2208b" + integrity sha512-eqZs9vUf53Vwr4y8TURTjX4olbNIWuIWdoWAQUdrediRxM3Kcejw+ERO3iEyKpX8FBGxK5hV4UJn2/hA690X2A== + iso-random-stream@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-1.1.1.tgz#83824bba77fbb3480dd6b35fbb06de7f9e93e80f" - integrity sha512-YEt/7xOwTdu4KXIgtdgGFkiLUsBaddbnkmHyaFdjJYIcD7V4gpQHPvYC5tyh3kA0PQ01y9lWm1ruVdf8Mqzovg== + 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 "^5.4.3" + buffer "^6.0.3" + readable-stream "^3.4.0" + +iso-random-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-2.0.0.tgz#3f0118166d5443148bbc134345fb100002ad0f1d" + integrity sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg== + dependencies: + events "^3.3.0" readable-stream "^3.4.0" iso-stream-http@~0.1.2: @@ -13013,6 +15400,11 @@ iso-stream-http@~0.1.2: inherits "^2.0.1" readable-stream "^3.1.1" +iso-url@^1.0.0, iso-url@^1.1.2, iso-url@^1.1.3, iso-url@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.1.5.tgz#875a0f2bf33fa1fc200f8d89e3f49eee57a8f0d9" + integrity sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ== + 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" @@ -13089,8 +15481,201 @@ isurl@^1.0.0-alpha5: 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" + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +it-all@^1.0.2, it-all@^1.0.4, it-all@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.5.tgz#e880510d7e73ebb79063a76296a2eb3cb77bbbdb" + integrity sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA== + +it-batch@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/it-batch/-/it-batch-1.0.8.tgz#3030b9d2af42c45a77796f39fe27f52aee711845" + integrity sha512-RfEa1rxOPnicXvaXJ1qNThxPrq8/Lc+KwSVWHFEEOp2CrjpjhR5WfmBJozhkbzZ/r/Gl0HjzVVrt0NpG8qczDQ== + +it-buffer@^0.1.1, it-buffer@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/it-buffer/-/it-buffer-0.1.3.tgz#efebef1cc35a6133cb9558e759345d4f17b3e1d0" + integrity sha512-9a2/9SYVwG7bcn3tpRDR4bXbtuMLXnDK48KVC+GXiQg97ZOOdWz2nIITBsOQ19b+gj01Rw8RNwtiLDLI8P8oiQ== + dependencies: + bl "^5.0.0" + buffer "^6.0.3" + +it-concat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-2.0.0.tgz#b4dc02aeb7365bada05b247c1ee50f3bbc147419" + integrity sha512-jchrEB3fHlUENWkVJRmbFJ1A7gcjJDmwiolQsHhVC14DpUIbX8fgr3SOC7XNE5OoUUQNL6/RaMCPChkPemyQUw== + dependencies: + bl "^5.0.0" + +it-drain@^1.0.1, it-drain@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-1.0.4.tgz#15ee0e90fba4b5bc8cff1c61b8c59d4203293baa" + integrity sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ== + +it-filter@^1.0.1, it-filter@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-1.0.2.tgz#7a89b582d561b1f1ff09417ad86f509dfaab5026" + integrity sha512-rxFUyPCrhk7WrNxD8msU10iEPhQmROoqwuyWmQUYY1PtopwUGBYyra9EYG2nRZADYeuT83cohKWmKCWPzpeyiw== + +it-first@^1.0.4, it-first@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.6.tgz#a015ecfc62d2d517382138da4142b35e61f4131e" + integrity sha512-wiI02c+G1BVuu0jz30Nsr1/et0cpSRulKUusN8HDZXxuX4MdUzfMp2P4JUk+a49Wr1kHitRLrnnh3+UzJ6neaQ== + +it-glob@^0.0.11, it-glob@~0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.11.tgz#c6d8daf783167e012a55cdcca52a33b7f4d6834f" + integrity sha512-p02iVYsvOPU7cW4sV9BC62Kz6Mz2aUTJz/cKWDeFqc05kzB3WgSq8OobZabVA/K4boSm6q+s0xOZ8xiArLSoXQ== + dependencies: + fs-extra "^9.0.1" + minimatch "^3.0.4" + +it-goodbye@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/it-goodbye/-/it-goodbye-3.0.0.tgz#14c8f7e8f692a6b2a0955b285853860eb9ab1bff" + integrity sha512-4Vje4IH39DBMuHqfm8ADkl1JTUeKbRpx9gzt7KfNLSPUmmRjm6Os8K+9vXhkRgXiJIqaBFEGnC8qVWfrJkBNuw== + dependencies: + buffer "^6.0.3" + +it-handshake@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/it-handshake/-/it-handshake-2.0.0.tgz#97671f33c13c47218a3df8a8d92de565a075b28c" + integrity sha512-K4q+mz8aLlCK3vTjtgNdHC9c/JbuOATsfogarjMsLcBZC5vYfKbX3Gq3AWcCdjIsIrPqzTlhPKSxl64LJkrt2w== + dependencies: + it-pushable "^1.4.0" + it-reader "^3.0.0" + p-defer "^3.0.0" + +it-last@^1.0.4, it-last@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.5.tgz#5c711c7d58948bcbc8e0cb129af3a039ba2a585b" + integrity sha512-PV/2S4zg5g6dkVuKfgrQfN2rUN4wdTI1FzyAvU+i8RV96syut40pa2s9Dut5X7SkjwA3P0tOhLABLdnOJ0Y/4Q== + +it-length-prefixed@^5.0.0, it-length-prefixed@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/it-length-prefixed/-/it-length-prefixed-5.0.2.tgz#66e8b889d695a57d582963cf053aa7255c31c9d5" + integrity sha512-SqAURaKKsjYbROIdTjW3UtqGrdZo1SHnkbeYYp7JwC5P0IIy7r4C0xNkmK2Va/fBmvXA++hMdDON9+2zesQlUA== + dependencies: + bl "^5.0.0" + buffer "^6.0.3" + varint "^6.0.0" + +it-length@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-length/-/it-length-1.0.2.tgz#3e906d650532d914f55afce9c0b8b342321dec6e" + integrity sha512-POIn66VMDhM1wzbKPSOGtldPldM5UQGV3ol85nmkv6HToIedetbJxPH6aX/fd19UamT7XtpakVyYb/NYCdD8DA== + +it-map@^1.0.2, it-map@^1.0.4, it-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.5.tgz#2f6a9b8f0ba1ed1aeadabf86e00b38c73a1dc299" + integrity sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ== + +it-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-1.0.0.tgz#b12310933ee79381eca2288245572a4f8d252030" + integrity sha512-bs40LMjG/9JMOcJ7pgyGLoOeWBpw28ZoMmZIk/1NCa5SUxd4elXCuadAr2qSjPiHz2GxrqoWGFAP7SePGddatw== + dependencies: + it-pushable "^1.4.0" + +it-merge@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-1.0.1.tgz#74a12045147981777e812a9b098823f2bc8ac882" + integrity sha512-1V1wDlzGaPprEGxwRJUMkoKvjZJCaqRp0o7i5fD3LeY7K2ZL5hmtHJnRTXHqJf9wO2ovzOjqxBUtFK4c3HAF0g== + dependencies: + it-pushable "^1.4.0" + +it-pair@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-pair/-/it-pair-1.0.0.tgz#b1add81f49af16a10b2939dbef7b1974fae87d6a" + integrity sha512-9raOiDu5OAuDOahtMtapKQDrQTxBfzlzrNcB6o7JARHkt+7Bb1dMkW/TpYdAjBJE77KH3e2zGzwpGUP9tXbLww== + dependencies: + get-iterator "^1.0.2" + +it-parallel-batch@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/it-parallel-batch/-/it-parallel-batch-1.0.9.tgz#15bc1a20c308253137d73141476cde1c23e13788" + integrity sha512-lfCxXsHoEtgyWj5HLrEQXlZF0p3c0hfYeVJAbxQIHIzHLq4lkYplUIe3UGxYl4n1Sjpcs6YL/87352399aVeIA== + dependencies: + it-batch "^1.0.8" + +it-pb-rpc@^0.1.9: + version "0.1.11" + resolved "https://registry.yarnpkg.com/it-pb-rpc/-/it-pb-rpc-0.1.11.tgz#22c3d3e4d635ffdd24453a225ff16cc1bde463c5" + integrity sha512-1Yvae7LNHNM/WzxWT7OyHqwpA7DZoGos22JioMZ5H6i9iExQf71NHE0phHKEfkJdWLo7SRqPLLbqs2zaeKCwPA== + dependencies: + is-buffer "^2.0.5" + it-handshake "^2.0.0" + it-length-prefixed "^5.0.2" + +it-peekable@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.2.tgz#3b2c7948b765f35b3bb07abbb9b2108c644e73c1" + integrity sha512-LRPLu94RLm+lxLZbChuc9iCXrKCOu1obWqxfaKhF00yIp30VGkl741b5P60U+rdBxuZD/Gt1bnmakernv7bVFg== + +it-pipe@^1.0.1, it-pipe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-1.1.0.tgz#f5964c6bb785dd776f11a62d1e75964787ab95ce" + integrity sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg== + +it-pushable@^1.4.0, it-pushable@^1.4.1, it-pushable@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-1.4.2.tgz#fb127a53ec99b35a3a455a775abc85ab193c220b" + integrity sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg== + dependencies: + fast-fifo "^1.0.0" + +it-reader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-3.0.0.tgz#56596c7742ec7c63b7f7998f6bfa3f712e333d0e" + integrity sha512-NxR40odATeaBmSefn6Xn43DplYvn2KtEKQzn4jrTRuPYXMky5M4e+KQ7aTJh0k0vkytLyeenGO1I1GXlGm4laQ== + dependencies: + bl "^5.0.0" + +it-take@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-take/-/it-take-1.0.0.tgz#2319a39d91463b4bf6151289126aa44889eda903" + integrity sha512-zfr2iAtekTGhHVWzCqqqgDnHhmzdzfCW92L0GvbaSFlvc3n2Ep/sponzmlNl2Kg39N5Py+02v+Aypc+i2c+9og== + +it-take@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/it-take/-/it-take-1.0.1.tgz#155b0f8ed4b6ff5eb4e9e7a2f4395f16b137b68a" + integrity sha512-6H6JAWYcyumKSpcIPLs6tHN4xnibphmyU79WQaYVCBtaBOzf4fn75wzvSH8fH8fcMlPBTWY1RlmOWleQxBt2Ug== + +it-tar@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-3.0.0.tgz#d25f2777c0da4d4bec1b01a1ab9d79495f459f4f" + integrity sha512-VhD1Hnx4IXDcQgYJnJgltkn+w5F8kiJaB46lqovh+YWfty2JGW7i40QQjWbSvcg1QfaU8is8AVX8xwx/Db9oOg== + dependencies: + bl "^5.0.0" + buffer "^6.0.3" + iso-constants "^0.1.2" + it-concat "^2.0.0" + it-reader "^3.0.0" + p-defer "^3.0.0" + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + +it-ws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/it-ws/-/it-ws-4.0.0.tgz#2e5ef0bcd857c1a898cc32c176ab6cac8f8306ea" + integrity sha512-XmTzpMkevc6rUboy73r0CCNhciMmL/Yxir9O6FujRwdrjysztqLBQ1Xkr4CpY2m7BVSCObKotaCWJeZ29lOXRA== + dependencies: + buffer "^6.0.3" + event-iterator "^2.0.0" + iso-url "^1.1.2" + ws "^7.3.1" iterable-ndjson@^1.1.0: version "1.1.0" @@ -13104,10 +15689,20 @@ iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jayson@^3.0.2: - version "3.4.4" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.4.4.tgz#dcedffba0c02785c4aa22dbff8c28966cae59773" - integrity sha512-fgQflh+Qnhdv9fjxTnpTsa2WUG/dgyeKQzIh5MJ77Qv2sqFyyAZn7mTUYgPjJMFjsKfb4HNsSBh6ktJeeQiAGQ== + version "3.6.2" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.2.tgz#e551e25abf2efe333051a6ed88b10f08c5288f50" + integrity sha512-hbl+x2xH6FT7nckw+Pq3lKOIJaMBKOgNJEVfvloDBWB8iSfzn/1U2igj1A5rplqNMFN/OnnaTNw8qPKVmoq83Q== dependencies: "@types/connect" "^3.4.33" "@types/express-serve-static-core" "^4.17.9" @@ -13200,16 +15795,6 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" -jest-diff@^24.0.0, jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-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" @@ -13263,11 +15848,6 @@ jest-environment-node@^26.6.2: jest-mock "^26.6.2" jest-util "^26.6.2" -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - jest-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" @@ -13326,16 +15906,6 @@ jest-leak-detector@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-matcher-utils@^24.0.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-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" @@ -13590,6 +16160,11 @@ jest@^26.6.1: import-local "^3.0.2" jest-cli "^26.6.3" +js-base64@^2.1.8: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + 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" @@ -13626,46 +16201,51 @@ js-yaml@3.x, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbi@^3.1.1, jsbi@^3.1.4: +jsbi@^3.1.1, jsbi@^3.1.2: version "3.1.4" resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.4.tgz#9654dd02207a66a4911b4e4bb74265bc2cbc9dd0" integrity sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg== +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha1-sBMHyym2GKHtJux56RH4A8TaAEA= + 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.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + version "16.5.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" + integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.1.0" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" html-encoding-sniffer "^2.0.1" is-potential-custom-element-name "^1.0.0" nwsapi "^2.2.0" - parse5 "5.1.1" + parse5 "6.0.1" request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + request-promise-native "^1.0.9" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + 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.0.0" - ws "^7.2.3" + whatwg-url "^8.5.0" + ws "^7.4.4" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -13698,6 +16278,14 @@ json-parse-even-better-errors@^2.3.0: 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" @@ -13718,14 +16306,6 @@ json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: eth-rpc-errors "^3.0.0" safe-event-emitter "^1.0.1" -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-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" @@ -13785,7 +16365,14 @@ json-text-sequence@~0.1.0: dependencies: delimit-stream "0.1.0" -json3@^3.3.2: +json-text-sequence@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.3.0.tgz#6603e0ee45da41f949669fd18744b97fb209e6ce" + integrity sha512-7khKIYPKwXQem4lWXfpIN/FEnhztCeRPSxH4qm3fVlqulwujrRDD54xAwDDn/qVKpFtV550+QAkcWJcufzqQuA== + dependencies: + "@sovpro/delimited-stream" "^1.1.0" + +json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== @@ -13857,6 +16444,85 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jss-plugin-camel-case@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz#93d2cd704bf0c4af70cc40fb52d74b8a2554b170" + integrity sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.6.0" + +jss-plugin-default-unit@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz#af47972486819b375f0f3a9e0213403a84b5ef3b" + integrity sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-global@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz#3e8011f760f399cbadcca7f10a485b729c50e3ed" + integrity sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-nested@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz#5f83c5c337d3b38004834e8426957715a0251641" + integrity sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz#297879f35f9fe21196448579fee37bcde28ce6bc" + integrity sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-rule-value-function@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz#3c1a557236a139d0151e70a82c810ccce1c1c5ea" + integrity sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz#e1fcd499352846890c38085b11dbd7aa1c4f2c78" + integrity sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.6.0" + +jss@10.6.0, jss@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.6.0.tgz#d92ff9d0f214f65ca1718591b68e107be4774149" + integrity sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + indefinite-observable "^2.0.1" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +jsx-ast-utils@^2.2.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.0" + "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" @@ -13865,6 +16531,21 @@ jsprim@^1.2.2: array-includes "^3.1.2" object.assign "^4.1.2" +junk@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" + integrity sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI= + +just-debounce-it@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/just-debounce-it/-/just-debounce-it-1.5.0.tgz#2276448332dd5925e825ba3c524a71da707bf628" + integrity sha512-itSWJS5d2DTSCizVJ2Z0Djx/dGmUGfZe7WNfUfVP23+htGcIcPHbEjL4eB8ljojTs/+oYwLexImRRCP0A2WXjA== + +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + 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" @@ -13875,6 +16556,23 @@ just-map-keys@^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== +just-safe-get@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/just-safe-get/-/just-safe-get-2.1.2.tgz#82c2df6bbb929bf4de8d46c06ef79e1a4dd98918" + integrity sha512-DPWEh00QFgJNyfULPwgc9rTvdiPYVyt69hcgjWbN3lzKMmISW43Hwc+nlRAIo+su6PLVqUOMEUJNYR1xFog7xQ== + +just-safe-set@^2.1.0, just-safe-set@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/just-safe-set/-/just-safe-set-2.2.1.tgz#25209ac3313c4c19b67159925a3dd86394338b54" + integrity sha512-Yx8y52RfcLjMJtn9UqKM2WFRvq8Xes5bozYU2Fd23Y3p1hJScuSH4i7zY9NfE4APSFfvBgFQFxlfWpGUeCrwkg== + +k-bucket@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.1.0.tgz#db2c9e72bd168b432e3f3e8fc092e2ccb61bff89" + integrity sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg== + dependencies: + randombytes "^2.1.0" + keccak256@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.2.tgz#ee0d38c2d5fb817f39d37c3fef842cab0164a067" @@ -13902,9 +16600,9 @@ keccak@^1.0.2: safe-buffer "^5.1.0" keypair@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.2.tgz#9aab2dea3355d22364e0156ef6a4282487c8fdee" - integrity sha512-7zRr8fKOWp/N8xfZyZV6WG1CUvKNiNahSDI4vjJnPJD60lHtIg62dpv60yCgcM2PP8QKv4S2UkZl+8MsYmQRpw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.3.tgz#4314109d94052a0acfd6b885695026ad29529c80" + integrity sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ== keytar@^5.0.0: version "5.6.0" @@ -13974,6 +16672,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + ky-universal@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.2.2.tgz#7a36e1a75641a98f878157463513965f799f5bfe" @@ -14007,6 +16710,11 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" +latinize@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/latinize/-/latinize-0.5.0.tgz#b81cc6faf3b4e6373b771c50c1a6d96df653f392" + integrity sha512-SHzxgdcFP/64lUEfX3183QALY2KdSQxad3gmhCc/b03QN1mbx0AnJWvsQjqoJLbucY9pJuK+NMbnasUIocDmnQ== + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -14050,6 +16758,13 @@ lerna@^3.22.1: import-local "^2.0.0" npmlog "^4.1.2" +level-codec@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-10.0.0.tgz#f9e892770532c6cdcc83529546730791b0c62c12" + integrity sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g== + dependencies: + buffer "^6.0.3" + level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -14062,6 +16777,16 @@ level-codec@~7.0.0: 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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.0.0.tgz#416ddaf0c2ed834f006aa3124ee68906eb4769d4" + integrity sha512-UHGiIdj+uiFQorOrURRvJF3Ei0uHc89ciM/aRi0qsWDV2f0HXypeXUPhJKL6DsONgSR76Pc0AI4sKYEYYRn2Dg== + +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" @@ -14076,6 +16801,13 @@ level-errors@^2.0.0, level-errors@~2.0.0: dependencies: errno "~0.1.1" +level-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-3.0.0.tgz#5719f2ad9061d9f2bd7cf22e4a7def893e6d2e60" + integrity sha512-MZXOQT061uEjxxxq4C/Jf+M3RdEKK9e3NbxlN7yOp1LDYoLVAhE2i1j0b7XqXfl8FjFtUL7phwr3Sn0wXXoMqA== + dependencies: + errno "^1.0.0" + level-errors@~1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" @@ -14092,6 +16824,14 @@ level-iterator-stream@^2.0.3: readable-stream "^2.0.5" xtend "^4.0.0" +level-iterator-stream@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz#85b3438e1b4c54ce5aa8c0eb973cfb628117df9e" + integrity sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.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" @@ -14111,6 +16851,25 @@ level-iterator-stream@~3.0.0: 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-js@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/level-js/-/level-js-6.0.0.tgz#1faff0eb92ca34e4565d1f7bca7026989855625b" + integrity sha512-7dp7JuaoQoqKW4ZGvrV1RB5f51/ktLdEo9fSDsh3Ofmg7sKCMu3X0CIngbY/IUz/YyskhN7LRvEVIkZHCY3LKQ== + dependencies: + abstract-leveldown "^7.0.0" + buffer "^6.0.3" + inherits "^2.0.3" + ltgt "^2.1.2" + level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -14119,6 +16878,30 @@ level-mem@^3.0.1: 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@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-6.0.0.tgz#1881e062d2dc694ce88101b3212d37ef90aa7a99" + integrity sha512-me656XRWfOVqs9wc+mWckZ6Rb1GuP33ndN4ZntDXwXFspX8cGA++Y+YqJsdE/mjTiipTuxXf047Z4rV62nOVuw== + dependencies: + encoding-down "^7.0.0" + levelup "^5.0.0" + level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -14150,6 +16933,18 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" +level-supports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.0.0.tgz#b0b9f63f30c4175fb2612217144f03f3b77580d9" + integrity sha512-8UJgzo1pvWP1wq80ZlkL19fPeK7tlyy0sBY90+2pj0x/kvzHCoLDWyuFJJMrsTn33oc7hbMkS3SkjCxMRPHWaw== + +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" @@ -14167,6 +16962,33 @@ level-ws@^1.0.0: 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" + +level@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-7.0.0.tgz#10fa2d5a0b3b21a99d33e9307c92c1270243d1ce" + integrity sha512-QrBnjcWywalh86ms9hfizvxT5aBHrgWEu6rLChS9tFE2wwFU3aI1r0v+2SSZIyeUr4O4PFo8+sCc1kebahdhlw== + dependencies: + level-js "^6.0.0" + level-packager "^6.0.0" + leveldown "^6.0.0" + +leveldown@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.0.0.tgz#3ec7f00463c45f8f7c8e68248d10ab299059c7ca" + integrity sha512-NEsyqpfdDhpFO49Zm9htNSsWixMa9Q9sUXgrBTaQNPyPo2Kx1wRctgIXMzc7tduXJqNff8QAwulv2eZDboghxQ== + dependencies: + abstract-leveldown "^7.0.0" + napi-macros "~2.0.0" + node-gyp-build "~4.2.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" @@ -14190,6 +17012,29 @@ levelup@^1.2.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" + +levelup@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-5.0.0.tgz#7cbbfd2ffc7495b3ebd75f81f5b328eb37866c3a" + integrity sha512-P4IKS4J17b6dzm8iI8Irv5gvOlrqJv04Lrpq1rAgZvjR2IsVSjbXQQo1LoK/PJuouxepLE8CTIiKGmHQYZnneA== + dependencies: + catering "^2.0.0" + deferred-leveldown "^6.0.0" + level-errors "^3.0.0" + level-iterator-stream "^5.0.0" + level-supports "^2.0.0" + queue-microtask "^1.2.3" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -14211,6 +17056,16 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libp2p-bootstrap@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/libp2p-bootstrap/-/libp2p-bootstrap-0.12.3.tgz#016b955e762410a759a0704d91350f62cc016778" + integrity sha512-4S7+YyZYy8wRmNxXGwsBsKrxGMk59nTqwDdBeEf9m3aVWZ0zdz5uu3WXq7sl8ULb703Zx5IdjGDrdbxhYtdqlA== + dependencies: + debug "^4.3.1" + mafmt "^9.0.0" + multiaddr "^9.0.1" + peer-id "^0.14.0" + 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" @@ -14223,6 +17078,26 @@ libp2p-crypto-secp256k1@~0.3.0: safe-buffer "^5.1.2" secp256k1 "^3.6.2" +libp2p-crypto@^0.19.0, libp2p-crypto@^0.19.3, libp2p-crypto@^0.19.4: + version "0.19.4" + resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz#90603a1318e903fbf142db3124ff3b2a1ba07ec7" + integrity sha512-8iUwiNlU/sFEtXQpxaehmXUQ5Fw6r52H7NH0d8ZSb8nKBbO6r8y8ft6f1to8A81SrFOVd4/zsjEzokpedDvRgw== + dependencies: + err-code "^3.0.1" + is-typedarray "^1.0.0" + iso-random-stream "^2.0.0" + keypair "^1.0.1" + multibase "^4.0.3" + multicodec "^3.0.1" + multihashes "^4.0.2" + multihashing-async "^2.1.2" + node-forge "^0.10.0" + pem-jwk "^2.0.0" + protobufjs "^6.10.2" + secp256k1 "^4.0.0" + uint8arrays "^2.1.4" + ursa-optional "^0.10.1" + libp2p-crypto@~0.16.1: version "0.16.3" resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.16.3.tgz#a4012361a6b6b3328d3d6b67cd1cb278e8d58f59" @@ -14245,11 +17120,335 @@ libp2p-crypto@~0.16.1: tweetnacl "^1.0.0" ursa-optional "~0.10.0" +libp2p-floodsub@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/libp2p-floodsub/-/libp2p-floodsub-0.25.1.tgz#ba4e804ad4021d3c360f2e8660ec1da41f989253" + integrity sha512-l1JiczkRCbVF34CN/zolC9ojyK/SDnAjlqTER1nDz+ikLjwfRydpdyN52tB6+p0qMYgIJ9R4hEYdjmNVL+cQFA== + dependencies: + debug "^4.2.0" + libp2p-interfaces "^0.10.0" + time-cache "^0.3.0" + uint8arrays "^2.1.4" + +libp2p-gossipsub@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/libp2p-gossipsub/-/libp2p-gossipsub-0.9.0.tgz#9676b22aa82be0994a0b33c6382dd393b55fadbb" + integrity sha512-OUcSx/1lJcS6go4npcd53pij3d2hedORJcAcL5JW3gST19y2WshLSjxGAsn6wjS+7z2h3g+VpR8KOvxvxsa3pg== + dependencies: + "@types/debug" "^4.1.5" + debug "^4.1.1" + denque "^1.4.1" + err-code "^2.0.0" + it-pipe "^1.0.1" + libp2p-interfaces "^0.10.0" + peer-id "^0.14.0" + protobufjs "^6.10.2" + time-cache "^0.3.0" + uint8arrays "^2.1.4" + +libp2p-interfaces@^0.10.0, libp2p-interfaces@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/libp2p-interfaces/-/libp2p-interfaces-0.10.4.tgz#4365d792b0b7ae048ac3b268ef3bf9f3da4d746b" + integrity sha512-xkeKmASKl9UHPZNpatPR1zhVyFvlTGHg2prDKKTLj2ggs8qZdF/83RhuuEgtgWIMPXgb7s85P2kugzolEISpQg== + dependencies: + "@types/bl" "^4.1.0" + abort-controller "^3.0.0" + abortable-iterator "^3.0.0" + chai "^4.3.4" + chai-checkmark "^1.0.1" + debug "^4.3.1" + delay "^5.0.0" + detect-node "^2.0.4" + dirty-chai "^2.0.1" + err-code "^3.0.1" + it-goodbye "^3.0.0" + it-length-prefixed "^5.0.2" + it-pair "^1.0.0" + it-pipe "^1.1.0" + it-pushable "^1.4.2" + libp2p-crypto "^0.19.0" + libp2p-tcp "^0.15.3" + multiaddr "^9.0.1" + multibase "^4.0.2" + multihashes "^4.0.2" + p-defer "^3.0.0" + p-limit "^3.1.0" + p-wait-for "^3.2.0" + peer-id "^0.14.2" + protobufjs "^6.10.2" + sinon "^10.0.0" + streaming-iterables "^5.0.4" + uint8arrays "^2.1.3" + +libp2p-kad-dht@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/libp2p-kad-dht/-/libp2p-kad-dht-0.22.0.tgz#f645524b82e442a59e2a7d9a4d56e382017678dc" + integrity sha512-yDMqvatwx8MkWM6ER5QoLX3v4QYzoCDw1SoHPTOrtDuT27RZDH5jE1kAYQeIDXfnZNr8seSmRVZ9N3N644EZUA== + dependencies: + abort-controller "^3.0.0" + cids "^1.1.5" + debug "^4.3.1" + err-code "^3.0.0" + hashlru "^2.3.0" + heap "~0.2.6" + interface-datastore "^4.0.0" + it-first "^1.0.4" + it-length-prefixed "^5.0.2" + it-pipe "^1.1.0" + k-bucket "^5.0.0" + libp2p-crypto "^0.19.0" + libp2p-interfaces "^0.10.0" + libp2p-record "^0.10.0" + multiaddr "^9.0.0" + multihashing-async "^2.1.0" + p-filter "^2.1.0" + p-map "^4.0.0" + p-queue "^6.6.2" + p-timeout "^4.1.0" + p-times "^3.0.0" + peer-id "^0.14.2" + promise-to-callback "^1.0.0" + protobufjs "^6.10.2" + streaming-iterables "^5.0.4" + uint8arrays "^2.1.4" + varint "^6.0.0" + xor-distance "^2.0.0" + +libp2p-mdns@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/libp2p-mdns/-/libp2p-mdns-0.16.0.tgz#a57ecf00b2de2a9003d3aaf71e1d7d745541d8c7" + integrity sha512-uJhR3L0oVbMRoXNEBekAxi4hlPRinnMbhCaHwr97+mAlWNpUyFWzrhK+NjmcAr+e2Kgaouh6Fw1eZe8Vtv5okg== + dependencies: + debug "^4.3.1" + multiaddr "^9.0.1" + multicast-dns "^7.2.0" + peer-id "^0.14.0" + +libp2p-mplex@^0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/libp2p-mplex/-/libp2p-mplex-0.10.3.tgz#dde26361125f2e3450f771bbf403f6cce5bab291" + integrity sha512-C21wrPCrTppK6d/vC9y0+6YOlJZpm6oa5BUQ1wHE7ucH2prNYWfOn/Gl+7i9Vs/hYa7dtiAWe3YoxCboTZTlSQ== + dependencies: + abort-controller "^3.0.0" + abortable-iterator "^3.0.0" + bl "^5.0.0" + debug "^4.3.1" + err-code "^3.0.1" + it-pipe "^1.1.0" + it-pushable "^1.4.1" + varint "^6.0.0" + +libp2p-noise@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/libp2p-noise/-/libp2p-noise-3.0.0.tgz#9320c4dd42019f4f75e2fddf265c4c5f5e5546ab" + integrity sha512-2UrR9mw+VeMRs0eOwqEqVEoFJxjCgibQsX4nnDFmFvb1C3+BnTuIUsqNS5YkxLhw3/q++8MvB/p5/2X0MRfA7g== + dependencies: + bcrypto "^5.4.0" + debug "^4.3.1" + it-buffer "^0.1.1" + it-length-prefixed "^5.0.2" + it-pair "^1.0.0" + it-pb-rpc "^0.1.9" + it-pipe "^1.1.0" + libp2p-crypto "^0.19.0" + peer-id "^0.14.3" + protobufjs "^6.10.1" + uint8arrays "^2.0.5" + +libp2p-record@^0.10.0, libp2p-record@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/libp2p-record/-/libp2p-record-0.10.3.tgz#a5d2ca245981f1d1163c0b1fdfef479f845b518c" + integrity sha512-0sg2HtCuFSHZ0jxAAND1CxTeEsiWHNs1oBNWcRKK0l2/MjYg+etQ7LxUC+7o2mT0FLzFPnxe6zPODem5y5Gtkw== + dependencies: + err-code "^3.0.0" + multihashes "^4.0.2" + multihashing-async "^2.1.2" + protobufjs "^6.10.2" + uint8arrays "^2.0.5" + +libp2p-tcp@^0.15.3, libp2p-tcp@^0.15.4: + version "0.15.4" + resolved "https://registry.yarnpkg.com/libp2p-tcp/-/libp2p-tcp-0.15.4.tgz#571c57dae60e6118162228abfa28700e86d47dca" + integrity sha512-MqXIlqV7t9z0A1Ww9Omd2XIlndcYOAh5R6kWRZ8Vo/CITazKUC5ZGNoj23hq/aEPaX8p5XmJs2BKESg/OuhGhQ== + dependencies: + abortable-iterator "^3.0.0" + class-is "^1.1.0" + debug "^4.3.1" + err-code "^3.0.1" + libp2p-utils "^0.3.0" + mafmt "^9.0.0" + multiaddr "^9.0.1" + stream-to-it "^0.2.2" + +libp2p-utils@^0.3.0, libp2p-utils@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/libp2p-utils/-/libp2p-utils-0.3.1.tgz#de68f7d0f443624d4067a18687b0359a11fc7cb8" + integrity sha512-LOVfww7a6Rhtoupl3z1ABuTEli5whY3VLTB9QntsOIwbOcX9GfmjuhqYbEDht9lVPAQl+rCUWbfDMvK121ryUg== + dependencies: + abortable-iterator "^3.0.0" + debug "^4.3.0" + err-code "^3.0.1" + ip-address "^7.1.0" + is-loopback-addr "^1.0.0" + multiaddr "^9.0.1" + private-ip "^2.1.1" + +libp2p-webrtc-peer@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/libp2p-webrtc-peer/-/libp2p-webrtc-peer-10.0.1.tgz#ca28a16e4992e922307badf8f64d71bf9584b0ec" + integrity sha512-Qi/YVrSI5sjU+iBvr1iAjGrakIEvzCS8S76v4q43jjlDb6Wj+S4OnFLH/uRlt7eLXcx4vlaI6huMzYrUAoopMg== + dependencies: + debug "^4.0.1" + err-code "^2.0.3" + get-browser-rtc "^1.0.0" + queue-microtask "^1.1.0" + randombytes "^2.0.3" + readable-stream "^3.4.0" + +libp2p-webrtc-star@^0.22.2: + version "0.22.3" + resolved "https://registry.yarnpkg.com/libp2p-webrtc-star/-/libp2p-webrtc-star-0.22.3.tgz#b463573fb1c7b4b371c72c34d477ebe03947f89a" + integrity sha512-1E9UAkkovkfBNStbrU4/LbnodIxc5lhSn2+9Aeernf7PUaLFGW7CkCFJ1Am3KnKNx1qeeGX4JvLZNvBHlWvZLg== + dependencies: + "@hapi/hapi" "^20.0.0" + "@hapi/inert" "^6.0.3" + abortable-iterator "^3.0.0" + class-is "^1.1.0" + debug "^4.2.0" + err-code "^3.0.1" + ipfs-utils "^7.0.0" + it-pipe "^1.1.0" + libp2p-utils "^0.3.0" + libp2p-webrtc-peer "^10.0.1" + mafmt "^9.0.0" + menoetius "0.0.2" + minimist "^1.2.5" + multiaddr "^9.0.1" + p-defer "^3.0.0" + peer-id "^0.14.2" + prom-client "^13.0.0" + socket.io "^2.3.0" + socket.io-client-next "npm:socket.io-client@^3.1.2" + socket.io-next "npm:socket.io@^3.1.2" + stream-to-it "^0.2.2" + streaming-iterables "^5.0.3" + +libp2p-websockets@^0.15.6: + version "0.15.7" + resolved "https://registry.yarnpkg.com/libp2p-websockets/-/libp2p-websockets-0.15.7.tgz#59581ced8663d731d6f0d44fb86e83345f969aca" + integrity sha512-wtbRYrWmobb3qEwHEDRZBoqWY9lqq3luCWAMAMdgrS9OLQn9E2h18De8GZlT9X3CidPixxRb5mOALIhOqSjcsA== + dependencies: + abortable-iterator "^3.0.0" + class-is "^1.1.0" + debug "^4.3.1" + err-code "^3.0.1" + ipfs-utils "^7.0.0" + it-ws "^4.0.0" + libp2p-utils "^0.3.0" + mafmt "^9.0.0" + multiaddr "^9.0.1" + multiaddr-to-uri "^7.0.0" + p-defer "^3.0.0" + p-timeout "^4.1.0" + +libp2p@^0.31.2: + version "0.31.5" + resolved "https://registry.yarnpkg.com/libp2p/-/libp2p-0.31.5.tgz#41419a786a6992b167d751968a7411e0615385cd" + integrity sha512-5GU0VSxMVV3tY3TFKVB9oRUHJPWv+wv4Z1n6vfgNKCvSIrfu/tm96fRuHMJuDduEe9hYPswb/7d/1BJxu94N8Q== + dependencies: + "@motrix/nat-api" "^0.3.1" + "@vascosantos/moving-average" "^1.1.0" + abort-controller "^3.0.0" + aggregate-error "^3.1.0" + any-signal "^2.1.1" + bignumber.js "^9.0.1" + cids "^1.1.5" + class-is "^1.1.0" + debug "^4.3.1" + err-code "^3.0.0" + es6-promisify "^6.1.1" + events "^3.3.0" + hashlru "^2.3.0" + interface-datastore "^4.0.0" + ipfs-utils "^7.0.0" + it-all "^1.0.4" + it-buffer "^0.1.2" + it-drain "^1.0.3" + it-filter "^1.0.1" + it-first "^1.0.4" + it-handshake "^2.0.0" + it-length-prefixed "^5.0.2" + it-map "^1.0.4" + it-merge "1.0.0" + it-pipe "^1.1.0" + it-take "1.0.0" + libp2p-crypto "^0.19.4" + libp2p-interfaces "^0.10.4" + libp2p-utils "^0.3.1" + mafmt "^9.0.0" + merge-options "^3.0.4" + multiaddr "^9.0.1" + multicodec "^3.0.1" + multihashing-async "^2.1.2" + multistream-select "^2.0.0" + mutable-proxy "^1.0.0" + node-forge "^0.10.0" + p-any "^3.0.0" + p-fifo "^1.0.0" + p-retry "^4.4.0" + p-settle "^4.1.1" + peer-id "^0.14.2" + private-ip "^2.1.0" + protobufjs "^6.10.2" + retimer "^3.0.0" + sanitize-filename "^1.6.3" + set-delayed-interval "^1.0.0" + streaming-iterables "^5.0.2" + timeout-abort-controller "^1.1.1" + varint "^6.0.0" + xsalsa20 "^1.1.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= +lint-staged@^10.5.4: + version "10.5.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + commander "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + dedent "^0.7.0" + enquirer "^2.3.6" + execa "^4.1.0" + listr2 "^3.2.2" + log-symbols "^4.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + +listr2@^3.2.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.8.2.tgz#99b138ad1cfb08f1b0aacd422972e49b2d814b99" + integrity sha512-E28Fw7Zd3HQlCJKzb9a8C8M0HtFWQeucE+S8YrSrqZObuCLPRHMRrR8gNmYt65cU9orXYHwvN5agXC36lYt7VQ== + dependencies: + chalk "^4.1.1" + cli-truncate "^2.1.0" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + rxjs "^6.6.7" + through "^2.3.8" + wrap-ansi "^7.0.0" + 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" @@ -14324,6 +17523,11 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loady@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/loady/-/loady-0.0.5.tgz#b17adb52d2fb7e743f107b0928ba0b591da5d881" + integrity sha512-uxKD2HIj042/HBx77NBcmEPsD+hxCgAtjEWlYNScuUjIsh/62Uyu39GOR68TBR68v+jqDL9zfftCWoUo4y03sQ== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -14347,6 +17551,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.11: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -14372,6 +17581,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flow@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -14482,6 +17701,11 @@ lodash.trimstart@^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" @@ -14502,7 +17726,7 @@ lodash@4.17.20: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@4.x, "lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: +lodash@4.x, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, 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.2.1, lodash@^4.7.0, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -14519,6 +17743,24 @@ log-symbols@3.0.0, log-symbols@^3.0.0: dependencies: chalk "^2.4.2" +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + loglevel@^1.6.7, loglevel@^1.6.8, loglevel@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" @@ -14631,12 +17873,12 @@ mafmt@^7.0.0: dependencies: multiaddr "^7.3.0" -mafmt@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-8.0.4.tgz#5b158a28bd800fb8d0e5c28bd9ee15120bed2a61" - integrity sha512-wwZ5+PU0vQw10kwQRyZin1Z0dqVOp0BnYlX1xvXHS2fmLwrrQCfU1+3tlW5MRcihUwGz1virnVhbRAU1biKfiw== +mafmt@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-9.0.0.tgz#6174f654ce25f45715cf7480ed3331c4c32924cc" + integrity sha512-BwKL6FJxc6R85K6gFE/pX7MVyCp0NkM2DJHg0RatxVgDlK4g9kqtfXQUt2iReSmTcgZss/Q/Bdfa2KTg4KyC+g== dependencies: - multiaddr "^8.0.0" + multiaddr "^9.0.1" magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" @@ -14719,9 +17961,9 @@ map-obj@^2.0.0: integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== map-visit@^1.0.0: version "1.0.0" @@ -14730,11 +17972,34 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-to-jsx@^6.11.0: + version "6.11.4" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" + integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw== + dependencies: + prop-types "^15.6.2" + unquote "^1.1.0" + match-all@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== +maximatch@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/maximatch/-/maximatch-0.1.0.tgz#86cd8d6b04c9f307c05a6b9419906d0360fb13a2" + integrity sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I= + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +mcl-wasm@^0.7.1: + version "0.7.6" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.6.tgz#c1789ebda5565d49b77d2ee195ff3e4d282f1554" + integrity sha512-cbRl3sUOkBeRY2hsM4t1EIln2TIdQBkSiTOqNTv/4Hu5KOECnMWCgjIf+a9Ebunyn22VKqkMF3zj6ejRzz7YBw== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -14780,6 +18045,18 @@ memdown@^1.0.0: 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" @@ -14818,7 +18095,14 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@^3.3.0: +menoetius@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/menoetius/-/menoetius-0.0.2.tgz#42173222b701e38591e57027c542fccd1c481fb0" + integrity sha512-7W0ayHMNgvEdFh+m3m29KA87nvT0JIGCXeSZa26fiSof+bwpg+olEjD8AAvtxZ3uhTcp2d+5r1dcV/KhR8PBVQ== + dependencies: + prom-client "^11.5.3" + +meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -14886,6 +18170,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -14923,6 +18214,32 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" +merkle-patricia-tree@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.1.0.tgz#010636c4cfd68682df33a2e3186b7d0be7b98b9d" + integrity sha512-vmP1J7FwIpprFMVjjSMM1JAwFce85Q+tp0TYIedYv8qaMh2oLUZ3ETXn9wbgi9S6elySzKzGa+Ai6VNKGEwSlg== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.0.8" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + rlp "^2.2.3" + semaphore-async-await "^1.5.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.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -14953,12 +18270,12 @@ micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + 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.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -14968,17 +18285,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.47.0, mime-db@1.x.x, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.46.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -15050,7 +18367,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -15216,15 +18533,30 @@ mocha@^7.1.2: yargs-unparser "1.6.0" mock-fs@^4.1.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.13.0.tgz#31c02263673ec3789f90eb7b6963676aa407a598" - integrity sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA== + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +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== + +mortice@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mortice/-/mortice-2.0.1.tgz#047b83c8c57d49e90e586f1f9e7d63e1f80d4a2b" + integrity sha512-9gsXmjq+5LZmXDIoyC/crf2i/7CUwDGSBEwSEsr1i/WfKmJ6DVt38B5kg6BE/WF/1/yfGJYiB1Wyiu423iI3nQ== + dependencies: + nanoid "^3.1.20" + observable-webworkers "^1.0.0" + p-queue "^6.0.0" + promise-timeout "^1.3.0" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -15257,6 +18589,13 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiaddr-to-uri@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-7.0.0.tgz#9bed2361e3eb7c18507e35204067bef98db8ac8e" + integrity sha512-VbscDpLcbV0m25tJqfnZSfbjVUuNlPa4BbD5l/7me1t0lc3SWI0XAoO5E/PNJF0e1qUlbdq7yjVFEQjUT+9r0g== + dependencies: + multiaddr "^9.0.1" + 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" @@ -15281,19 +18620,18 @@ multiaddr@^7.2.1, multiaddr@^7.3.0: multibase "^0.7.0" varint "^5.0.0" -multiaddr@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" - integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== +multiaddr@^9.0.0, multiaddr@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-9.0.1.tgz#4a3b5a21b37e4df5b443f2ca957304ea5bfd4604" + integrity sha512-fubxMjVoRPcz3GYBb63Z6ADCY6BoqezbnL2o8owDcfYqhwW61oFtIlsZGiNKIVC2Fk1Od5rf/3z34QSGJFT/uA== dependencies: cids "^1.0.0" - class-is "^1.1.0" dns-over-http-resolver "^1.0.0" - err-code "^2.0.3" + err-code "^3.0.1" is-ip "^3.1.0" - multibase "^3.0.0" - uint8arrays "^1.1.0" - varint "^5.0.0" + multibase "^4.0.2" + uint8arrays "^2.1.3" + varint "^6.0.0" multibase@^0.7.0: version "0.7.0" @@ -15311,21 +18649,12 @@ multibase@^1.0.0, multibase@^1.0.1: base-x "^3.0.8" buffer "^5.5.0" -multibase@^3.0.0, multibase@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" - integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== - dependencies: - "@multiformats/base-x" "^4.0.1" - web-encoding "^1.0.6" - -multibase@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.2.tgz#8250a0f50d0ed49765146bf0e3431e3df9b249ac" - integrity sha512-l0XMK4O5I9cCfxC0/UMDX/UxlIlrqkjEZQNG+ZUUrsGhnXWgFXgatYOQSONiR/lQGfBO463UyZkh3SiQBpjRIQ== +multibase@^4.0.1, multibase@^4.0.2, multibase@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.4.tgz#55ef53e6acce223c5a09341a8a3a3d973871a577" + integrity sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg== dependencies: "@multiformats/base-x" "^4.0.1" - web-encoding "^1.1.0" multibase@~0.6.0: version "0.6.1" @@ -15348,6 +18677,14 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multicast-dns@^7.2.0: + version "7.2.2" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.2.tgz#5731da04f47d1e435ac457e5ac7b4b39d866a5a1" + integrity sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g== + dependencies: + dns-packet "^4.0.0" + 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" @@ -15389,16 +18726,7 @@ multihashes@^1.0.1: multibase "^1.0.1" varint "^5.0.0" -multihashes@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" - integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== - dependencies: - multibase "^3.1.0" - uint8arrays "^2.0.5" - varint "^6.0.0" - -multihashes@^4.0.1: +multihashes@^4.0.1, multihashes@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.2.tgz#d76aeac3a302a1bed9fe1ec964fb7a22fa662283" integrity sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ== @@ -15407,6 +18735,18 @@ multihashes@^4.0.1: uint8arrays "^2.1.3" varint "^5.0.2" +multihashing-async@^2.0.0, multihashing-async@^2.1.0, multihashing-async@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.2.tgz#9ed68f183bde70e0416b166bbc59a0c0623a0ede" + integrity sha512-FTPNnWWxwIK5dXXmTFhySSF8Fkdqf7vzqpV09+RWsmfUhrsL/b3Arg3+bRrBnXTtjxm3JRGI3wSAtQHL0QCxhQ== + dependencies: + blakejs "^1.1.0" + err-code "^3.0.0" + js-sha3 "^0.8.0" + multihashes "^4.0.1" + murmurhash3js-revisited "^3.0.0" + uint8arrays "^2.1.3" + multihashing-async@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.5.2.tgz#4af40e0dde2f1dbb12a7c6b265181437ac26b9de" @@ -15463,6 +18803,22 @@ multimatch@^3.0.0: arrify "^1.0.1" minimatch "^3.0.4" +multistream-select@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/multistream-select/-/multistream-select-2.0.0.tgz#b977475974925c0c27b26bae4ef6990c430280d4" + integrity sha512-MhzWeoIh2Rojqm32glGNmWbzyffrGrYtg68sWKwj8ZuALHGDySNiU5j6wV69BpUtKRQmQ6zWNUB5few57VB7/w== + dependencies: + bl "^5.0.0" + debug "^4.1.1" + err-code "^3.0.1" + it-first "^1.0.6" + it-handshake "^2.0.0" + it-length-prefixed "^5.0.0" + it-pipe "^1.0.1" + it-reader "^3.0.0" + p-defer "^3.0.0" + uint8arrays "^2.1.4" + murmur-128@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" @@ -15483,9 +18839,14 @@ murmurhash3js@^3.0.1: integrity sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg= mustache@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.1.0.tgz#8c1b042238a982d2eb2d30efc6c14296ae3f699d" - integrity sha512-0FsgP/WVq4mKyjolIyX+Z9Bd+3WS8GOwoUTyKXT5cTYMGeauNTi2HPCwERqseC1IHAy0Z7MDZnJBfjabd4O8GQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mutable-proxy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mutable-proxy/-/mutable-proxy-1.0.0.tgz#3c6e6f9304c2e5a4751bb65b5a66677de9bcf3c8" + integrity sha512-4OvNRr1DJpy2QuDUV74m+BWZ//n4gG4bmd21MzDSPqHEidIDWqwyOjcadU1LBMO3vXYGurVKjfBrxrSQIHFu9A== mute-stream@0.0.7: version "0.0.7" @@ -15511,7 +18872,7 @@ nan@2.14.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nan@^2.12.1, nan@^2.14.0, nan@^2.14.1, nan@^2.14.2, nan@^2.2.1: +nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.14.1, nan@^2.14.2, nan@^2.2.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -15521,10 +18882,20 @@ nano-json-stream-parser@^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.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +nanoassert@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-1.1.0.tgz#4f3152e09540fde28c76f44b19bbcd1d5a42478d" + integrity sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40= + +nanoid@^3.0.2, nanoid@^3.1.12, nanoid@^3.1.20: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +nanoid@^3.1.22: + version "3.1.22" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" + integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== nanomatch@^1.2.9: version "1.2.13" @@ -15548,6 +18919,16 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +native-abort-controller@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.3.tgz#35974a2e189c0d91399c8767a989a5bf058c1435" + integrity sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA== + native-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" @@ -15579,11 +18960,16 @@ negotiator@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.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -15594,6 +18980,17 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nise@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -15603,9 +19000,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@^2.7.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.20.0.tgz#0659ee1a4a04dacabd3ac4429fac6297ed58e92e" - integrity sha512-6ldtfVR5l3RS8D0aT+lj/uM2Vv/PGEkeWzt2tl8DFBsGY/IuVnAIHl+dG6C14NlWClVv7Rn2+ZDvox+35Hx2Kg== + version "2.26.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.26.0.tgz#355d5d4bc603e856f74197adbf3f5117a396ba40" + integrity sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ== dependencies: semver "^5.4.1" @@ -15643,7 +19040,7 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@2.6.1, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.3.0, node-fetch@^2.5.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== @@ -15666,7 +19063,7 @@ node-forge@~0.9.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.2.tgz#b35a44c28889b2ea55cabf8c79e3563f9676190a" integrity sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw== -node-gyp-build@^4.2.0: +node-gyp-build@^4.2.0, node-gyp-build@~4.2.1: 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== @@ -15688,6 +19085,22 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -15728,9 +19141,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" - integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== + 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" @@ -15739,11 +19152,33 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.61, node-releases@^1.1.70: +node-releases@^1.1.61, node-releases@^1.1.71: version "1.1.71" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-sass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-5.0.0.tgz#4e8f39fbef3bac8d2dc72ebe3b539711883a78d2" + integrity sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^7.0.3" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^7.1.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + nodeify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" @@ -15777,6 +19212,13 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + normalize-hex@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" @@ -15795,13 +19237,13 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" - integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" + integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== dependencies: - hosted-git-info "^3.0.6" - resolve "^1.17.0" - semver "^7.3.2" + hosted-git-info "^4.0.1" + resolve "^1.20.0" + semver "^7.3.4" validate-npm-package-license "^3.0.1" normalize-path@^2.1.1: @@ -15841,10 +19283,18 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== +notistack@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-1.0.7.tgz#1a5a3a8ba91d6ce9bd34cfd27eaff17b16c5d45c" + integrity sha512-D6pHvYgSGmS86r8KspQb4A75DXnIRrCdmUX79Gg8eJ1/I4IMDy0DULUqjytwEkQT02naeSnTLc9WkepLjHKQug== + dependencies: + clsx "^1.1.0" + hoist-non-react-statics "^3.3.0" + npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + 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" @@ -15902,14 +19352,14 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: 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.1, npmlog@^4.1.2: +npmlog@^4.0.0, npmlog@^4.0.1, npmlog@^4.1.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== @@ -15983,16 +19433,16 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + version "1.10.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" + integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== 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: +object-is@^1.0.1, object-is@^1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -16042,7 +19492,7 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.2: +object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== @@ -16052,7 +19502,7 @@ object.entries@^1.1.0, object.entries@^1.1.2: es-abstract "^1.18.0-next.1" has "^1.0.3" -object.fromentries@^2.0.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== @@ -16078,7 +19528,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== @@ -16117,6 +19567,11 @@ obs-store@^4.0.3: through2 "^2.0.3" xtend "^4.0.1" +observable-webworkers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/observable-webworkers/-/observable-webworkers-1.0.0.tgz#dcbd484a9644d512accc351962c6e710313fbb68" + integrity sha512-+cECwCR8IEh8UY5nefQVLO9Cydqpk1izO+o7BABmKjXfJZyEOzBWY3ss5jbOPM6KmEa9aQExvAtTW6tVTOsNAQ== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -16153,14 +19608,14 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: 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: +open@^7.0.2, open@^7.3.1, 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== @@ -16180,6 +19635,14 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" +optimism@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.15.0.tgz#c65e694bec7ce439f41e9cb8fc261a72d798125b" + integrity sha512-KLKl3Kb7hH++s9ewRcBhmfpXgXF0xQ+JZ3xQFuPjnoT6ib2TDmYyVkKENmGxivsN2G3VRxpXuauCkB4GYOhtPw== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + optimist@~0.3.5: version "0.3.7" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" @@ -16257,7 +19720,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^3.1.0: +os-locale@^3.0.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== @@ -16287,6 +19750,14 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-any@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" + integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== + dependencies: + p-cancelable "^2.0.0" + p-some "^5.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" @@ -16297,16 +19768,41 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + 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-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + 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-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -16329,14 +19825,14 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: 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: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -16395,11 +19891,24 @@ p-queue@^4.0.0: dependencies: eventemitter3 "^3.1.0" +p-queue@^6.0.0, p-queue@^6.6.1, p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-reflect@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-2.1.0.tgz#5d67c7b3c577c4e780b9451fc9129675bd99fe67" + integrity sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg== + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -16407,6 +19916,30 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" +p-retry@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.5.0.tgz#6685336b3672f9ee8174d3769a660cb5e488521d" + integrity sha512-5Hwh4aVQSu6BEP+w2zKlVXtFAaYQe1qWuVADSgoeVlLjwe/Q/AMSoRR4MDeaAfu8llT+YNbEijWu/YF3m6avkg== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.12.0" + +p-settle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/p-settle/-/p-settle-4.1.1.tgz#37fbceb2b02c9efc28658fc8d36949922266035f" + integrity sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ== + dependencies: + p-limit "^2.2.2" + p-reflect "^2.1.0" + +p-some@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" + integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== + dependencies: + aggregate-error "^3.0.0" + p-cancelable "^2.0.0" + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -16414,6 +19947,25 @@ p-timeout@^1.1.1: dependencies: p-finally "^1.0.0" +p-timeout@^3.0.0, p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-timeout@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" + integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== + +p-times@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-times/-/p-times-3.0.0.tgz#477ff51aa8cfe7edef4cfcd4bc7e0250b13b4183" + integrity sha512-/Z7mcs8Liie8E7IHI9SBtmkHVW/GjLroQ94ALoAMIG20mqFMuh56/3WYhtOTqX9ccRSOxgaCkFC94Bat1Ofskg== + dependencies: + p-map "^4.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" @@ -16424,6 +19976,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-wait-for@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-wait-for/-/p-wait-for-3.2.0.tgz#640429bcabf3b0dd9f492c31539c5718cb6a3f1f" + integrity sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA== + dependencies: + p-timeout "^3.0.0" + p-waterfall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00" @@ -16471,6 +20030,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-duration@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.0.0.tgz#8605651745f61088f6fb14045c887526c291858c" + integrity sha512-X4kUkCTHU1N/kEbwK9FpUJ0UZQa90VzeczfS704frR30gljxDG0pSziws06XlK+CGRSo/1wtG1mFIdBFQTMQNw== + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -16526,10 +20090,20 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +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.2, parseurl@~1.3.3: version "1.3.3" @@ -16568,14 +20142,14 @@ patch-package@6.2.2: tmp "^0.0.33" patch-package@^6.2.2: - version "6.4.5" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.5.tgz#5fcefa3129c32185725b8a038753f4815c191957" - integrity sha512-iZl3nNUEQ3cdoY1U4Gj7p9aIGgn27aD3Z32TEh+13remRlkEzbc1+CdjFvy/zT/JK2EtY4ERwoiHKQU9B0PEvw== + 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 "^1.2.1" + find-yarn-workspace-root "^2.0.0" fs-extra "^7.0.1" is-ci "^2.0.0" klaw-sync "^6.0.0" @@ -16623,7 +20197,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^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: +path-is-inside@^1.0.1, 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= @@ -16689,9 +20263,9 @@ pathval@^1.1.1: integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + 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" @@ -16699,6 +20273,24 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: safe-buffer "^5.0.1" sha.js "^2.4.8" +peek-readable@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.3.tgz#932480d46cf6aa553c46c68566c4fb69a82cd2b1" + integrity sha512-mpAcysyRJxmICBcBa5IXH7SZPvWkcghm6Fk8RekoS3v+BpbSzlZzuWbMx+GXrlUwESi9qHar4nVEZNMKylIHvg== + +peer-id@^0.14.0, peer-id@^0.14.1, peer-id@^0.14.2, peer-id@^0.14.3: + version "0.14.8" + resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.14.8.tgz#667c6bedc8ab313c81376f6aca0baa2140266fab" + integrity sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig== + dependencies: + cids "^1.1.5" + class-is "^1.1.0" + libp2p-crypto "^0.19.0" + minimist "^1.2.5" + multihashes "^4.0.2" + protobufjs "^6.10.2" + uint8arrays "^2.0.5" + 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" @@ -16741,10 +20333,10 @@ performance-now@^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.0.5, picomatch@^2.2.1, picomatch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== pify@4.0.1, pify@^4.0.1: version "4.0.1" @@ -16818,6 +20410,13 @@ pkginfo@^0.4.1: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= +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" @@ -16842,6 +20441,16 @@ pocket-js-core@0.0.3: dependencies: axios "^0.18.0" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -17067,11 +20676,10 @@ postcss-image-set-function@^3.0.1: postcss-values-parser "^2.0.0" postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: - lodash.template "^4.5.0" postcss "^7.0.2" postcss-lab-function@^2.0.1: @@ -17460,21 +21068,18 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz#042d74e137db83e6f294712096cb413f5aa612c4" + integrity sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +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: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -17526,12 +21131,12 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po supports-color "^6.1.0" postcss@^8.1.0: - version "8.2.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.7.tgz#48ed8d88b4de10afa0dfd1c3f840aa57b55c4d47" - integrity sha512-DsVLH3xJzut+VT+rYr0mtvOtpTjSyqDwPf5EZWXcb0uAKfitGpTY9Ec+afi2+TgdN8rWS9Cs88UDYehKo/RvOw== + version "8.2.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.13.tgz#dbe043e26e3c068e45113b1ed6375d2d37e2129f" + integrity sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ== dependencies: colorette "^1.2.2" - nanoid "^3.1.20" + nanoid "^3.1.22" source-map "^0.6.1" postinstall-postinstall@^2.1.0: @@ -17545,9 +21150,9 @@ preact@10.4.1: integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== preact@^10.5.9: - version "10.5.12" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.12.tgz#6a8ee8bf40a695c505df9abebacd924e4dd37704" - integrity sha512-r6siDkuD36oszwlCkcqDJCAKBQxGoeEGytw2DGMD5A/GGdu5Tymw+N2OBXwvOLxg6d1FeY8MgMV3cc5aVQo4Cg== + version "10.5.13" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.13.tgz#85f6c9197ecd736ce8e3bec044d08fd1330fa019" + integrity sha512-q/vlKIGNwzTLu+jCcvywgGrt+H/1P/oIRSD6mV4ln3hmlC+Aa34C7yfPI4+5bzW8pONyVXYS7SvXosy2dKKtWQ== prebuild-install@5.3.3: version "5.3.3" @@ -17607,7 +21212,7 @@ prettier@^1.13.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@^2.0.5, prettier@^2.1.2: +prettier@^2.1.2, prettier@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== @@ -17625,26 +21230,6 @@ pretty-error@^2.1.1: lodash "^4.17.20" renderkid "^2.0.4" -pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.1.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - 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" @@ -17655,10 +21240,23 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -prism-media@^1.2.2: - version "1.2.7" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.7.tgz#697c9630e2a473a5dfab19c71eba398a083c2bf0" - integrity sha512-thS1z3L6BDmf724sqLC73bHGjSYArFTYHa7cqInyS3EdDNTHKgDCXy7l+IhRvlnX7aFNiUb8jJcC+R8ezxwgMA== +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== + +prism-media@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" + integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== + +private-ip@^2.1.0, private-ip@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-2.2.1.tgz#4fe167d04e12eca5c67cdcbd3224e86b38c79253" + integrity sha512-jN1WT/br/VNW9xEcwHr6DjtOKxQ5qOIqmh7o+co2TWgq56pZJw99iO3UT1tWdfgsQiyK9FqG4ji3ykwpjFqITA== + dependencies: + ip-regex "^4.3.0" + netmask "^2.0.2" private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -17680,6 +21278,20 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +prom-client@^11.5.3: + version "11.5.3" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-11.5.3.tgz#5fedfce1083bac6c2b223738e966d0e1643756f8" + integrity sha512-iz22FmTbtkyL2vt0MdDFY+kWof+S9UB/NACxSn2aJcewtw+EERsen0urSkZ2WrHseNdydsvcxCTAnPcSMZZv4Q== + dependencies: + tdigest "^0.1.1" + +prom-client@^13.0.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.1.0.tgz#1185caffd8691e28d32e373972e662964e3dba45" + integrity sha512-jT9VccZCWrJWXdyEtQddCDszYsiuWj5T0ekrPszi/WEegj3IZy6Mm09iOOVM86A4IKMWq8hZkT2dD9MaSe+sng== + dependencies: + tdigest "^0.1.1" + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -17698,6 +21310,11 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise-timeout@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/promise-timeout/-/promise-timeout-1.3.0.tgz#d1c78dd50a607d5f0a5207410252a3a0914e1014" + integrity sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg== + 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" @@ -17706,6 +21323,13 @@ promise-to-callback@^1.0.0: is-fn "^1.0.0" set-immediate-shim "^1.0.1" +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promise@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -17725,7 +21349,7 @@ promisify-es6@^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, prompts@^2.0.1: +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== @@ -17733,6 +21357,14 @@ prompts@2.4.0, prompts@^2.0.1: 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" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -17740,7 +21372,16 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + +prop-types@^15.5.10, 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== @@ -17749,11 +21390,44 @@ prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +proper-lockfile@^4.0.0, proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +property-expr@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910" + integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg== + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protobufjs@^6.10.1, protobufjs@^6.10.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + protocol-buffers-schema@^3.3.1: version "3.5.1" resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad" @@ -17799,7 +21473,7 @@ pseudomap@^1.0.1: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.28: +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== @@ -17948,9 +21622,11 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.5.2, qs@^6.7.0, qs@^6.9.4: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + 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" @@ -18013,10 +21689,10 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== +queue-microtask@^1.1.0, 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" @@ -18028,6 +21704,33 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +r1csfile@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.3.tgz#61cef5a842a607800dc7a341d72eb31040ffacfa" + integrity sha512-TNrodnbHw5yAMv2gj0Ezf22XS3q8zGEjdPHZLBmJauIPFxm6QmyzxlB92yZ5WNkjEtJiS7p1hvkO9/RsJXRDjw== + dependencies: + big-integer "^1.6.48" + +r1csfile@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.5.tgz#63e2a74f833693356f18d517b9fc42238df7e187" + integrity sha512-B+BdKPb/WUTp4N/3X4d1Spgx9Ojx5tFVejGZRJxpTtzq34mC8Vi/czWfiPj85V8kud31lCfYcZ16z7+czvM0Sw== + dependencies: + fastfile "0.0.1" + ffjavascript "0.1.0" + +rabin-wasm@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/rabin-wasm/-/rabin-wasm-0.1.5.tgz#5b625ca007d6a2cbc1456c78ae71d550addbc9c9" + integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== + dependencies: + "@assemblyscript/loader" "^0.9.4" + bl "^5.0.0" + debug "^4.3.1" + minimist "^1.2.5" + node-fetch "^2.6.1" + readable-stream "^3.6.0" + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -18052,7 +21755,7 @@ ramdasauce@^2.1.0: 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: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.3, 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== @@ -18107,6 +21810,17 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-activation@^0.9.4: + version "0.9.4" + resolved "https://registry.yarnpkg.com/react-activation/-/react-activation-0.9.4.tgz#e2438922829f50cbb8ed04f565f2f4e88f597ae9" + integrity sha512-xY0KutcnlrUIldsAGjWW3JcLMIJEXFc6cl7noFFJn2oDvM0LTvXj69eYqzFWnYxzqMFHpOCyOtfl+eZTJYlaIQ== + dependencies: + create-react-context "^0.3.0" + hoist-non-react-statics "^3.3.0" + jsx-ast-utils "^2.2.1" + react-node-key "^0.3.0" + szfe-tools "^0.0.0-beta.7" + 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" @@ -18119,10 +21833,24 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" -react-dev-utils@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.3.tgz#b61ed499c7d74f447d4faddcc547e5e671e97c08" - integrity sha512-4lEA5gF4OHrcJLMUV1t+4XbNDiJbsAWCH5Z2uqlTqW6dD7Cf5nEASkeXrCI/Mz83sI2o527oBIFKVMXtRf1Vtg== +react-app-rewired@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-2.1.8.tgz#e192f93b98daf96889418d33d3e86cf863812b56" + integrity sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q== + dependencies: + semver "^5.6.0" + +react-blockies@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/react-blockies/-/react-blockies-1.4.1.tgz#d4f0faf95ac197213a297a370a4d7f77ea3d0b08" + integrity sha512-4N015X5oPNnD3xQPsiqolOFzPZSSWyc5mJhJUZShUCHtiGUxVN+1qsWTcglkHMNySux9hUofaispqcw9QkWP5Q== + dependencies: + prop-types "^15.5.10" + +react-dev-utils@^11.0.3: + 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" @@ -18149,37 +21877,52 @@ react-dev-utils@^11.0.1: 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== +react-display-name@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-display-name/-/react-display-name-0.2.5.tgz#304c7cbfb59ee40389d436e1a822c17fe27936c6" + integrity sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg== + +react-dom@^17.0.2: + 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" - prop-types "^15.6.2" - scheduler "^0.19.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.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: +react-hook-form@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.6.0.tgz#ec8aa8376738356c5af09992404292ba04067ac4" + integrity sha512-Ai3lx5TZO/W274PVgIqOkjhCAxQJ7KRU9c6tTM1M0LDctCUZ0LavirUiy+42b0gxGLUswO0vPsxcpw1CkkebUA== + +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.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== +"react-is@^16.8.0 || ^17.0.0", 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-query@^2.26.2: - version "2.26.4" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-2.26.4.tgz#18239b4c0b61d0b744f0d4a91f566b294fa9f752" - integrity sha512-sXGG0gh1ah11AcfptYOCRpGDoYMnssq6riQUpQaLSM2EOodVkexp3zNLk1MFDgfRGuXQst40Tnu17oNwni66aA== +react-node-key@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/react-node-key/-/react-node-key-0.3.0.tgz#7e194ff4a2af1a888d30f2bc331423247f5877ef" + integrity sha512-lxrlTqVjfkoB2akg38eRkdbA90V1OFtmZmehRvAjjaJDwa45tpKcih7qwDr9kShUFnUlrXtlXQV2o3xYg5UAww== dependencies: - "@babel/runtime" "^7.5.5" + jsx-ast-utils "^2.2.1" + szfe-tools "^0.0.0-beta.7" + +react-onclickout@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/react-onclickout/-/react-onclickout-2.0.8.tgz#d178b13fb87a481356761b454aa60df7069b2da4" + integrity sha1-0XixP7h6SBNWdhtFSqYN9wabLaQ= react-refresh@^0.8.3: version "0.8.3" @@ -18215,14 +21958,14 @@ react-router@5.2.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== +react-scripts@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" + integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== dependencies: "@babel/core" "7.12.3" - "@pmmmwh/react-refresh-webpack-plugin" "0.4.2" - "@svgr/webpack" "5.4.0" + "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" + "@svgr/webpack" "5.5.0" "@typescript-eslint/eslint-plugin" "^4.5.0" "@typescript-eslint/parser" "^4.5.0" babel-eslint "^10.1.0" @@ -18245,7 +21988,7 @@ react-scripts@4.0.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" + eslint-webpack-plugin "^2.5.2" file-loader "6.1.1" fs-extra "^9.0.1" html-webpack-plugin "4.5.0" @@ -18264,39 +22007,47 @@ react-scripts@4.0.1: postcss-safe-parser "5.0.2" prompts "2.4.0" react-app-polyfill "^2.0.0" - react-dev-utils "^11.0.1" + react-dev-utils "^11.0.3" react-refresh "^0.8.3" resolve "1.18.1" resolve-url-loader "^3.1.2" - sass-loader "8.0.2" + sass-loader "^10.0.5" 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-dev-server "3.11.1" webpack-manifest-plugin "2.2.0" workbox-webpack-plugin "5.1.4" optionalDependencies: fsevents "^2.1.3" -react-spring@^8.0.27: - version "8.0.27" - resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-8.0.27.tgz#97d4dee677f41e0b2adcb696f3839680a3aa356a" - integrity sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g== +react-spring@^7.2.11: + version "7.2.11" + resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-7.2.11.tgz#90962121c925c8a3181801b926eaf94c9b5c942e" + integrity sha512-VHoN34MTZFkvamy7Vlmcx2HR5WVSuaQQjFNlVRNyWNi+rcjYT8OcsggzeDltFycseBh8cZveYTc/iPCEe6O0Sw== dependencies: - "@babel/runtime" "^7.3.1" - prop-types "^15.5.8" + "@babel/runtime" "^7.0.0" -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== +react-transition-group@^4.0.0, react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^17.0.2: + 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" - prop-types "^15.6.2" read-cmd-shim@^1.0.1: version "1.0.5" @@ -18414,7 +22165,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@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.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@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.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== @@ -18443,6 +22194,14 @@ readable-stream@~1.0.15, readable-stream@~1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" +readable-web-to-node-stream@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.1.tgz#3f619b1bc5dd73a4cfe5c5f9b4f6faba55dff845" + integrity sha512-4zDC6CvjUyusN7V0QLsXVB7pJCD9+vtrM9bYDRv6uBQ+SKfx36rp5AFNPRgh9auKRul/a1iFZJYXcCbwRL+SaA== + dependencies: + "@types/readable-stream" "^2.3.9" + readable-stream "^3.6.0" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -18490,6 +22249,22 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +recursive-copy@^2.0.9: + version "2.0.11" + resolved "https://registry.yarnpkg.com/recursive-copy/-/recursive-copy-2.0.11.tgz#7ed3c0f4b6bb0ffda7cab62bf865a82f5a391c39" + integrity sha512-DqL2kO10mUne7XK5BPcwRtOJJZKhddD7IrW4UmHmKrwdV3HLPWcw6Jr4Jh12ooddfJOVz7ynFoFYYnPM7De0Og== + dependencies: + del "^2.2.0" + emitter-mixin "0.0.3" + errno "^0.1.2" + graceful-fs "^4.1.4" + junk "^1.0.1" + maximatch "^0.1.0" + mkdirp "^0.5.1" + pify "^2.3.0" + promise "^7.0.1" + slash "^1.0.0" + recursive-readdir@2.2.2, recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -18521,6 +22296,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + 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" @@ -18634,9 +22414,9 @@ regjsparser@^0.1.4: jsesc "~0.5.0" regjsparser@^0.6.4: - version "0.6.7" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" - integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + 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" @@ -18662,9 +22442,9 @@ renderkid@^2.0.4: strip-ansi "^3.0.0" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + 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.6.1: version "1.6.1" @@ -18685,7 +22465,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.8: +request-promise-native@^1.0.9: 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== @@ -18785,9 +22565,9 @@ resolve-pathname@^3.0.0: integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve-url-loader@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" - integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.3.tgz#49ec68340f67d8d2ab6b401948d5def3ab2d0367" + integrity sha512-WbDSNFiKPPLem1ln+EVTE+bFUBdTTytfQZWbmghroaFNFaAVmGq0Saqw6F/306CwgPXsGwXVxbODE+3xAo/YbA== dependencies: adjust-sourcemap-loader "3.0.0" camelcase "5.3.1" @@ -18825,7 +22605,7 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, 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== @@ -18833,6 +22613,14 @@ resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1 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" @@ -18868,6 +22656,16 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retimer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" + integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== + +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== + retry@0.12.0, retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -18906,6 +22704,13 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +rifm@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.7.0.tgz#debe951a9c83549ca6b33e5919f716044c2230be" + integrity sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ== + dependencies: + "@babel/runtime" "^7.3.1" + rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -18920,6 +22725,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -18943,6 +22755,24 @@ rollup-plugin-babel@^4.3.3: "@babel/helper-module-imports" "^7.0.0" rollup-pluginutils "^2.8.1" +rollup-plugin-inject-process-env@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-inject-process-env/-/rollup-plugin-inject-process-env-1.3.1.tgz#2d7660fe76f2b221b976cb35597763ffcaad3db3" + integrity sha512-kKDoL30IZr0wxbNVJjq+OS92RJSKRbKV6B5eNW4q3mZTFqoWDh6lHy+mPDYuuGuERFNKXkG+AKxvYqC9+DRpKQ== + dependencies: + magic-string "^0.25.7" + +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + 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" @@ -18970,6 +22800,13 @@ rollup@^1.31.1: "@types/node" "*" acorn "^7.1.0" +rollup@^2.45.2: + version "2.47.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.47.0.tgz#9d958aeb2c0f6a383cacc0401dff02b6e252664d" + integrity sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg== + optionalDependencies: + fsevents "~2.3.1" + 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" @@ -19014,23 +22851,23 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0, rxjs@^6.6.3: - version "6.6.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" - integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== +rxjs@^6.4.0, rxjs@^6.6.3, rxjs@^6.6.7: + 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@*, 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.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-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.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" @@ -19070,28 +22907,45 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + 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== +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== 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" + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + +sass-loader@^10.0.5: + version "10.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" + integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" -sax@~1.2.4: +sax@>=0.6.0, 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.0: +saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== @@ -19099,9 +22953,9 @@ saxes@^5.0.0: xmlchars "^2.2.0" sc-istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.5.tgz#1896066484d55336cf2cdbcc7884dc79da50dc76" - integrity sha512-7wR5EZFLsC4w0wSm9BUuCgW+OGKAU7PNlW5L0qwVPbh+Q1sfVn2fyzfMXYCm6rkNA5ipaCOt94nApcguQwF5Gg== + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" async "1.x" @@ -19118,10 +22972,10 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.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== +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" @@ -19135,7 +22989,7 @@ schema-utils@^1.0.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: +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== @@ -19175,6 +23029,14 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + 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" @@ -19189,7 +23051,7 @@ secp256k1@^3.0.1, secp256k1@^3.6.2, secp256k1@^3.7.1, secp256k1@^3.8.0: nan "^2.14.0" safe-buffer "^5.1.2" -secp256k1@^4.0.1: +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== @@ -19208,18 +23070,28 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.7: +selfsigned@^1.10.8: version "1.10.8" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== 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@2 || 3 || 4 || 5", "semver@2.x || 3.x || 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, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -19236,13 +23108,13 @@ semver@7.3.2: integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== semver@7.x, semver@^7.0.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + 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@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, 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== @@ -19324,6 +23196,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-delayed-interval@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz#1f7c065780a365f10250f8a80e2be10175ea0388" + integrity sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw== + 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" @@ -19436,7 +23313,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -19478,6 +23355,18 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sinon@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" + integrity sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw== + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/samsam" "^5.3.1" + diff "^4.0.2" + nise "^4.1.0" + supports-color "^7.1.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -19498,6 +23387,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -19547,26 +23445,133 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -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== +snarkjs@^0.1.22: + version "0.1.31" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.1.31.tgz#a9cf6982c2aa4b1b0da224a339c6370accda4041" + integrity sha512-Xu9Ai89GPLUI6hSyVkc6LRE3sUEje7+eokHeKkb4sZuWW4JqPKWRW7ZtwM7VjsisgVM2gVAg9IYsMD4k+MhuPA== + dependencies: + chai "^4.2.0" + circom_runtime "0.0.6" + escape-string-regexp "^1.0.5" + ffjavascript "0.1.0" + keccak "^3.0.0" + r1csfile "0.0.5" + yargs "^12.0.5" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-adapter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" + integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== + +"socket.io-client-next@npm:socket.io-client@^3.1.2": + version "3.1.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-3.1.3.tgz#57ddcefea58cfab71f0e94c21124de8e3c5aa3e2" + integrity sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw== + dependencies: + "@types/component-emitter" "^1.2.10" + backo2 "~1.0.2" + component-emitter "~1.3.0" + debug "~4.3.1" + engine.io-client "~4.1.0" + parseuri "0.0.6" + socket.io-parser "~4.0.4" + +socket.io-client@2.4.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-next@npm:socket.io@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" + integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~4.1.0" + socket.io-adapter "~2.1.0" + socket.io-parser "~4.0.3" + +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" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== dependencies: - debug "^3.2.5" + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + +sockjs-client@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" + integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== + dependencies: + debug "^3.2.6" eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.1" -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== dependencies: - faye-websocket "^0.10.0" + faye-websocket "^0.11.3" uuid "^3.4.0" - websocket-driver "0.6.5" + websocket-driver "^0.7.4" socks-proxy-agent@^4.0.0: version "4.0.2" @@ -19649,6 +23654,11 @@ solidity-coverage@^0.7.15: shelljs "^0.8.3" web3-utils "^1.3.0" +solidity-rlp@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/solidity-rlp/-/solidity-rlp-2.0.4.tgz#bf281230e8441b3d91cd41edd1a9d6c9884ce05b" + integrity sha512-s0iQgnOh4KUQqrWVQKWZS6GnpxxWyI2Wgzcmjot13eHoHt0tZ8wmJRwwF+gdQg83mHC6d9Iuo5PjrUf6qEW72g== + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -19663,11 +23673,36 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" +sort-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" + integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== + dependencies: + is-plain-obj "^2.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-explorer@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.2.tgz#857cab5dd9d1d7175e9c5c2739dc9ccfb99f2dc5" + integrity sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg== + dependencies: + btoa "^1.2.1" + chalk "^4.1.0" + convert-source-map "^1.7.0" + ejs "^3.1.5" + escape-html "^1.0.3" + glob "^7.1.6" + gzip-size "^6.0.0" + lodash "^4.17.20" + open "^7.3.1" + source-map "^0.7.3" + temp "^0.9.4" + yargs "^16.2.0" + 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" @@ -19679,6 +23714,14 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: 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" @@ -19694,7 +23737,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.11, source-map-support@^0.5.12, source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: +source-map-support@^0.5.11, source-map-support@^0.5.12, source-map-support@^0.5.13, source-map-support@^0.5.17, 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== @@ -19712,6 +23755,13 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -19734,6 +23784,11 @@ sourcemap-codec@^1.4.4: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +sparse-array@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/sparse-array/-/sparse-array-1.3.2.tgz#0e1a8b71706d356bc916fe754ff496d450ec20b0" + integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -19821,6 +23876,11 @@ split@^1.0.0: dependencies: through "2" +sprintf-js@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -19878,13 +23938,13 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.0, ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + 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.0: +ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== @@ -19928,6 +23988,13 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -19975,6 +24042,13 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-to-it@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.3.tgz#b9320ceb26a51b313de81036d4354d9b657f4d2d" + integrity sha512-xaK9EjPtLox5rrC7YLSBXSanTtUJN/lzJlMFvy9VaROmnyvy0U/X6m2uMhXPJRn3g3M9uOSIzTszW7BPiWSg9w== + dependencies: + get-iterator "^1.0.2" + 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" @@ -19983,6 +24057,11 @@ stream-to-pull-stream@^1.7.1, stream-to-pull-stream@^1.7.2: looper "^3.0.0" pull-stream "^3.2.3" +streaming-iterables@^5.0.2, streaming-iterables@^5.0.3, streaming-iterables@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/streaming-iterables/-/streaming-iterables-5.0.4.tgz#4e0eed3416eed956968d1d19b9776dc480802062" + integrity sha512-nEs6hBGIPsVz6uq6pscGGKfoPDQWrDQW0b0UHurtSDysekfKLmkPg7FQVRE2sj3Rad6yUo9E1sGTxOWyYsHQ/g== + streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" @@ -19998,10 +24077,15 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + 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" @@ -20020,7 +24104,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.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== @@ -20046,7 +24130,7 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.2: +string.prototype.matchall@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== @@ -20220,6 +24304,15 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +strtok3@^6.0.3: + version "6.0.8" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.8.tgz#c839157f615c10ba0f4ae35067dad9959eeca346" + integrity sha512-QLgv+oiXwXgCgp2PdPPa+Jpp4D9imK9e/0BsyfeFMr6QL6wMVqoVn9+OXQ9I7MZbmUzN6lmitTJ09uwS2OmGcw== + dependencies: + "@tokenizer/token" "^0.1.1" + "@types/debug" "^4.1.5" + peek-readable "^3.1.3" + style-loader@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -20228,17 +24321,17 @@ style-loader@1.3.0: loader-utils "^2.0.0" schema-utils "^2.7.0" -styled-components@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.2.1.tgz#6ed7fad2dc233825f64c719ffbdedd84ad79101a" - integrity sha512-sBdgLWrCFTKtmZm/9x7jkIabjFNVzCUeKfoQsM6R3saImkUnjx0QYdLwJHBjY9ifEcmjDamJDVfknWm1yxZPxQ== +styled-components@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.0.tgz#e47c3d3e9ddfff539f118a3dd0fd4f8f4fb25727" + integrity sha512-bPJKwZCHjJPf/hwTJl6TbkSZg/3evha+XPEizrZUGb535jLImwDUdjTNxXqjjaASt2M4qO4AVfoHJNe3XB/tpQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/traverse" "^7.4.5" "@emotion/is-prop-valid" "^0.8.8" "@emotion/stylis" "^0.8.4" "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1" + babel-plugin-styled-components ">= 1.12.0" css-to-react-native "^3.0.0" hoist-non-react-statics "^3.0.0" shallowequal "^1.1.0" @@ -20305,9 +24398,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + 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" @@ -20353,25 +24446,40 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -symbol-observable@^1.0.4: +symbol-observable@1.2.0, symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-observable@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + 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== +szfe-tools@^0.0.0-beta.7: + version "0.0.0-beta.7" + resolved "https://registry.yarnpkg.com/szfe-tools/-/szfe-tools-0.0.0-beta.7.tgz#580bacbc3d4e353c6ac00ab337b037aa53d14e96" + integrity sha512-/M7+Tel2G8zapfDYZlz17hf9ViqAi/loZMfM81b5iZMyaWL/t5dajBszEBI2kyIDFzlLT4btBcq+BimFgmAHug== + dependencies: + "@babel/runtime" "^7.10.2" + table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + version "6.6.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.6.0.tgz#905654b79df98d9e9a973de1dd58682532c40e8e" + integrity sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.flatten "^4.4.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -20468,6 +24576,13 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +tdigest@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" + integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= + dependencies: + bintrees "1.0.1" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -20485,6 +24600,14 @@ temp-write@^3.4.0: temp-dir "^1.0.0" uuid "^3.0.1" +temp@^0.9.4: + version "0.9.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== + dependencies: + mkdirp "^0.5.1" + rimraf "~2.6.2" + tempy@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" @@ -20542,9 +24665,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.6.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" - integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -20624,7 +24747,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3.4, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, 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= @@ -20634,11 +24757,26 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +time-cache@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/time-cache/-/time-cache-0.3.0.tgz#ed0dfcf0fda45cdc95fbd601fda830ebf1bd5d8b" + integrity sha1-7Q388P2kXNyV+9YB/agw6/G9XYs= + dependencies: + lodash.throttle "^4.1.1" + 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= +timeout-abort-controller@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" + integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== + dependencies: + abort-controller "^3.0.0" + retimer "^2.0.0" + timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" @@ -20646,6 +24784,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timestamp-nano@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/timestamp-nano/-/timestamp-nano-1.0.0.tgz#03bf0b43c2bdcb913a6a02fbaae6f97d68650f3a" + integrity sha512-NO/1CZigzlCWQiWdIGv8ebXt6Uk77zdLz2NE7KcZRU5Egj2+947lzUpk30xQUQlq5dRY25j7ZulG4RfA2DHYfA== + timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" @@ -20656,11 +24799,18 @@ tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.0, tiny-warning@^1.0.3: +tiny-warning@^1.0.0, tiny-warning@^1.0.2, 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@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.1.1.tgz#eb97c038995af74efbfe8156f5e07fdd0c935539" + integrity sha512-Z048AOz/w9b6lCbJUpevIJpRpUztENl8zdv1bmAKVHimfqRFl92ROkmT9rp7TVBnrEw2gtMTol/2Cp2S2kJa4Q== + dependencies: + tmp "0.1.0" + tmp-promise@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a" @@ -20694,6 +24844,11 @@ tmpl@1.0.x: 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" @@ -20763,12 +24918,25 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -token-amount@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/token-amount/-/token-amount-0.3.0.tgz#0ab93000a26ebe364aee30ec7ec6bc92a043bc25" - integrity sha512-T9dCmen36//NFhoKoGLG/7m3pcxgG7JYc5rh24hMOHmMLLyDWsLkpXaMGZes3TOZiNW/tsfK9wGp6ZjfKVJE7g== +token-amount@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/token-amount/-/token-amount-0.1.0.tgz#1b25775346a7de4df47a988ecf022ffe2d4b6f76" + integrity sha512-3p2HE8ef1PKB6Rl6tMmQW289esS5PWsPq/mG8JyyQUFe/1I3LtDBmSGYzzqW/99uvvoQNpUURI1fX8uZE6LSow== + dependencies: + jsbi "^3.1.1" + +token-types@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.1.1.tgz#bd585d64902aaf720b8979d257b4b850b4d45c45" + integrity sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q== dependencies: - jsbi "^3.1.4" + "@tokenizer/token" "^0.1.1" + ieee754 "^1.2.1" + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" @@ -20778,14 +24946,14 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +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: - ip-regex "^2.1.0" - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" tr46@^1.0.1: version "1.0.1" @@ -20831,11 +24999,25 @@ trim-right@^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@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + "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== +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -20878,10 +25060,17 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" +ts-invariant@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.3.tgz#13aae22a4a165393aaf5cecdee45ef4128d358b8" + integrity sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA== + dependencies: + tslib "^2.1.0" + ts-jest@^26.4.2: - version "26.5.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.3.tgz#a6ee00ba547be3b09877550df40a1465d0295554" - integrity sha512-nBiiFGNvtujdLryU7MiMQh1iPmnZ/QvOskBbD2kURiI1MwqvxlxNnaAB/z9TbslMqCsSbu5BXvSSQPc5tvHGeA== + version "26.5.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.5.tgz#e40481b6ee4dd162626ba481a2be05fa57160ea5" + integrity sha512-7tP4m+silwt1NHqzNRAPjW1BswnAhopTdc2K3HEkRZjF0ZG2F/e/ypVH0xiZIMfItFtD3CX0XFbwPzp9fIEUVg== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -20953,10 +25142,10 @@ tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: 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: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== tslint@^6.1.3: version "6.1.3" @@ -20990,9 +25179,9 @@ tsutils@^2.29.0: tslib "^1.8.1" tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + 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" @@ -21008,6 +25197,14 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl-sealedbox-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tweetnacl-sealedbox-js/-/tweetnacl-sealedbox-js-1.2.0.tgz#37f0d49a24445d6f55a1b9e8870568529bcb233f" + integrity sha512-QoCr8K2hwri+ky7SUa22oSre8g88XaWi0hwwWd16pJMuDyn5gL/UyE0PyR2EOFEMJ70T2trJ9+Sv+Qa18olEmQ== + dependencies: + blakejs "^1.1.0" + tweetnacl "^1.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" @@ -21018,7 +25215,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: 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: +tweetnacl@^1.0.0, tweetnacl@^1.0.1, tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -21037,21 +25234,26 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: 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.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== +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.0, type-fest@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -21086,9 +25288,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132" - integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg== + 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, typechain@^3.0.0: version "3.0.0" @@ -21104,9 +25306,9 @@ typechain@3.0.0, typechain@^3.0.0: ts-generator "^0.1.1" typechain@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.2.tgz#31a961bf1fc43b8cde39193247439715e43ce5d3" - integrity sha512-SopnfdQrS5ek6sTbvymsnBACA+70FstX/ZLWY8lQWNdLUXGyoGFoa73Y+1hKlbz2DfCnO39bQ551qUMhk5GYSw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.3.tgz#e8fcd6c984676858c64eeeb155ea783a10b73779" + integrity sha512-tmoHQeXZWHxIdeLK+i6dU0CU0vOd9Cndr3jFTZIMzak5/YpFZ8XoiYpTZcngygGBqZo+Z1EUmttLbW9KkFZLgQ== dependencies: command-line-args "^4.0.7" debug "^4.1.1" @@ -21134,9 +25336,9 @@ typescript@^3.8.3: integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== typescript@^4.0.3, typescript@^4.0.5, typescript@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" @@ -21160,31 +25362,35 @@ typical@^2.6.0, typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= +typical@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/typical/-/typical-6.0.1.tgz#89bd1a6aa5e5e96fa907fb6b7579223bff558a06" + integrity sha512-+g3NEp7fJLe9DPa1TArHm9QAA7YciZmWnfAqEaFrBihQ7epOv9i99rjtgb6Iz0wh3WuQDjsCTDfgRoGnmHN81A== + +uglify-es@^3.3.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + uglify-js@^3.1.4: - version "3.13.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.0.tgz#66ed69f7241f33f13531d3d51d5bcebf00df7f69" - integrity sha512-TWYSWa9T2pPN4DIJYbU9oAjQx+5qdV5RUDxwARg8fmJZrD/V27Zj0JngW5xg1DFz42G0uDYl2XhzF6alSzD62w== + version "3.13.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" + integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -uint8arrays@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" - integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== - dependencies: - multibase "^3.0.0" - web-encoding "^1.0.2" - -uint8arrays@^2.0.5, uint8arrays@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.3.tgz#6e09ed40687042ed7b0047b498c0e876efe5a49a" - integrity sha512-2h2Z2OIqzrhHmZTv9ViJVyZZreFkHRHeihh7SxLVY/nLUVJhU4ey/u74tWsgMR6hhMSO2g5rhKmdLQIg3lKiUQ== +uint8arrays@^2.0.5, uint8arrays@^2.1.2, uint8arrays@^2.1.3, uint8arrays@^2.1.4, uint8arrays@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.5.tgz#9e6e6377a9463d5eba4620a3f0450f7eb389a351" + integrity sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA== dependencies: multibase "^4.0.1" - web-encoding "^1.1.0" ultron@~1.1.0: version "1.1.1" @@ -21197,14 +25403,14 @@ umask@^1.1.0: integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= unbox-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz#eeacbc4affa28e9b3d36b5eaeccc50b3251b1d3f" - integrity sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA== + 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.0" - has-symbols "^1.0.0" - which-boxed-primitive "^1.0.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" unc-path-regex@^0.1.2: version "0.1.2" @@ -21295,6 +25501,11 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +universal-parse-url@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/universal-parse-url/-/universal-parse-url-1.0.2.tgz#db97b4dc41fe22d7538044e06bfb077b7f6e1acf" + integrity sha1-25e03EH+ItdTgETga/sHe39uGs8= + universal-user-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" @@ -21307,7 +25518,7 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0: +universalify@^0.1.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== @@ -21317,6 +25528,11 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unordered-array-remove@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz#c546e8f88e317a0cf2644c97ecb57dba66d250ef" + integrity sha1-xUbo+I4xegzyZEyX7LV9umbSUO8= + unorm@^1.3.3: version "1.6.0" resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" @@ -21327,7 +25543,7 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unquote@~1.1.1: +unquote@^1.1.0, unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= @@ -21380,7 +25596,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3: +url-parse@^1.4.3, url-parse@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== @@ -21406,7 +25622,7 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -ursa-optional@~0.10.0: +ursa-optional@^0.10.1, 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== @@ -21414,15 +25630,21 @@ ursa-optional@~0.10.0: bindings "^1.5.0" nan "^2.14.2" -use-viewport@^0.2.0: +use-inside@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/use-viewport/-/use-viewport-0.2.0.tgz#0a5971515de2704bdceb0a7ff998bc9cd14eb039" - integrity sha512-D3bY0Co9ZUdXCQGMTaUQZhLgpWpXFw2xbHDXccxtHyGch5oY0OVprQldEm2U5CwUuNbKMNW9n8Kyj8AlbbY4yQ== + resolved "https://registry.yarnpkg.com/use-inside/-/use-inside-0.2.0.tgz#cdf7bc3e40495a154d16735584c242aa0f00eb13" + integrity sha512-GYJSslg+NyAeASSwWk1wyc6/Bek/ACIrmuFY/bPbgUjQAVrtVvzjSNiOxNh20e7zanJz/bPxtIQIxq7EzjSPqQ== dependencies: - lodash.throttle "^4.1.1" prop-types "^15.7.2" -use-wallet@^0.8.0: +use-token@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/use-token/-/use-token-0.2.0.tgz#5690aec9fcc327cf843eb8ff01cd1f75f7d93a25" + integrity sha512-lvKboDH7okV/SAb9q4Fs+kgEOS976SvHPMzpy+KCKXXVAMzG30znfsvYKiiK2Mdg+QU4vil0+NHXZ6ozuo+ysw== + dependencies: + js-sha3 "^0.8.0" + +use-wallet@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/use-wallet/-/use-wallet-0.8.1.tgz#2532b02c9a44bdb65c4a5be4f653f0957954c820" integrity sha512-V0Y6oMnLXWBhl8+DYdouf3VZtjKJppLEBRpdQP95bGQn0s70ODWJQmqYmB1E7zWy04YYPkBofLQbMVzPyArGAA== @@ -21446,12 +25668,17 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" - integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== + 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-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + utf8@3.0.0, utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -21477,7 +25704,7 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util.promisify@^1.0.0: +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== @@ -21512,7 +25739,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.0: +util@^0.12.0, util@^0.12.3: version "0.12.3" resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== @@ -21567,14 +25794,14 @@ uuidv4@6.0.6: uuid "7.0.2" v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + 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.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" - integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== + version "7.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz#04bfd1026ba4577de5472df4f5e89af49de5edda" + integrity sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -21600,6 +25827,13 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== +varint-decoder@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/varint-decoder/-/varint-decoder-1.0.0.tgz#289dab7887ee58d0c7be3a3353abeab4ca60aa77" + integrity sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ== + dependencies: + varint "^5.0.0" + varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" @@ -21648,11 +25882,6 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-for-expect@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" - integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== - walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -21660,17 +25889,36 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -walletlink@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.0.3.tgz#8905deed6ba9a07d5dd49d709db359df571b0cc4" - integrity sha512-fl8LmelFpgVITdGxGkoGhCn9coIcV/8ubg2kT96DaqGi2N4BNvUjlmgOsXMuHvVUMg4kGVZeq2XKaChXBC9ySA== +walletlink@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.1.0.tgz#15725b829ec09d7e933527726793f36b4c374776" + integrity sha512-kCl+3q9ZCnbD2ti+rA/rI/cTRBv2MfBU174uxvUW6piTIWwP5wM5ehDZp7lgW+aEOrjK49hBGOPn0CDUsD0tSQ== dependencies: + "@metamask/safe-event-emitter" "2.0.0" bind-decorator "^1.0.11" bn.js "^5.1.1" clsx "^1.1.0" + eth-block-tracker "4.4.3" + eth-json-rpc-filters "4.2.2" + eth-rpc-errors "4.0.2" + json-rpc-engine "6.1.0" preact "^10.5.9" rxjs "^6.6.3" +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" + +wasmbuilder@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.10.tgz#b8298b2095ef9979d32f3881d1feef1705ec868a" + integrity sha512-zQSvZ7d74d9OvN+mCN6ucNne4QS5/cBBYTHldX0Oe+u9gStY21orapvuX1ajisA7RVIpuFhYg+ZgdySsPfeh0A== + dependencies: + big-integer "^1.6.48" + watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" @@ -21703,12 +25951,10 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-encoding@^1.0.2, web-encoding@^1.0.6, web-encoding@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.0.tgz#b8ed50f0e23ba239542ba11ebe885b75a0b95bea" - integrity sha512-KzYonGdJnZB3qvhK8hKca5qXk/wp+hgwGNTY1TnqtF2CzDzpN8szOC3ejhX9+wbhCq3vQs/TjM8BykS1kor0lQ== - optionalDependencies: - "@zxing/text-encoding" "0.9.0" +web-vitals@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.1.tgz#2df535e3355fb7fbe34787b44b736e270e539377" + integrity sha512-jYOaqu01Ny1NvMwJ3dBJDUOJ2PGWknZWH4AUnvFOscvbdHMERIKT2TlgiAey5rVyfOePG7so2JcXXZdSnBvioQ== web3-bzz@1.2.11: version "1.2.11" @@ -21720,12 +25966,12 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.9.tgz#25f8a373bc2dd019f47bf80523546f98b93c8790" - integrity sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA== +web3-bzz@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.5.tgz#f181a1319d9f867f4183b147e7aebd21aecff4a0" + integrity sha512-XiEUAbB1uKm/agqfwBsCW8fbw+sma85TfwuDpdcy591vinVk0S9TfWgLxro6v1KJ6nSELySIbKGbAJbh2GSyxw== dependencies: - "@types/node" "^10.12.18" + "@types/node" "^12.12.6" got "9.6.0" swarm-js "^0.1.40" underscore "1.9.1" @@ -21739,23 +25985,14 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz#6381077c3e01c127018cb9e9e3d1422697123315" - integrity sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.9" - web3-utils "1.2.9" - -web3-core-helpers@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.4.tgz#b8549740bf24d5c71688d89c3cdd802d8d36b4e4" - integrity sha512-n7BqDalcTa1stncHMmrnFtyTgDhX5Fy+avNaHCf6qcOP2lwTQC8+mdHVBONWRJ6Yddvln+c8oY/TAaB6PzWK0A== +web3-core-helpers@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.5.tgz#9f0ff7ed40befb9f691986e66fd94c828c7b1b13" + integrity sha512-HYh3ix5FjysgT0jyzD8s/X5ym0b4BGU7I2QtuBiydMnE0mQEWy7GcT9XKpTySA8FTOHHIAQYvQS07DN/ky3UzA== dependencies: underscore "1.9.1" - web3-eth-iban "1.3.4" - web3-utils "1.3.4" + web3-eth-iban "1.3.5" + web3-utils "1.3.5" web3-core-method@1.2.11: version "1.2.11" @@ -21769,29 +26006,17 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.9.tgz#3fb538751029bea570e4f86731e2fa5e4945e462" - integrity sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.9" - web3-core-promievent "1.2.9" - web3-core-subscriptions "1.2.9" - web3-utils "1.2.9" - -web3-core-method@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.4.tgz#6c2812d96dd6c811b9e6c8a5d25050d2c22b9527" - integrity sha512-JxmQrujsAWYRRN77P/RY7XuZDCzxSiiQJrgX/60Lfyf7FF1Y0le4L/UMCi7vUJnuYkbU1Kfl9E0udnqwyPqlvQ== +web3-core-method@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.5.tgz#995fe12f3b364469e5208a88d72736327b231faa" + integrity sha512-hCbmgQ+At6OTuaNGAdjXMsCr4eUCmp9yGKSuaB5HdkNVDpqFso4HHjVxcjNrTyJp3OZnyjKBzQzK1ZWLpLl84Q== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" underscore "1.9.1" - web3-core-helpers "1.3.4" - web3-core-promievent "1.3.4" - web3-core-subscriptions "1.3.4" - web3-utils "1.3.4" + web3-core-helpers "1.3.5" + web3-core-promievent "1.3.5" + web3-core-subscriptions "1.3.5" + web3-utils "1.3.5" web3-core-promievent@1.2.11: version "1.2.11" @@ -21800,17 +26025,10 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz#bb1c56aa6fac2f4b3c598510f06554d25c11c553" - integrity sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw== - dependencies: - eventemitter3 "3.1.2" - -web3-core-promievent@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.4.tgz#d166239012d91496cdcbe91d5d54071ea818bc73" - integrity sha512-V61dZIeBwogg6hhZZUt0qL9hTp1WDhnsdjP++9fhTDr4vy/Gz8T5vibqT2LLg6lQC8i+Py33yOpMeMNjztaUaw== +web3-core-promievent@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.5.tgz#33c34811cc4e2987c56e5192f9a014368c42ca39" + integrity sha512-K0j8x3ZJr0eAyNvyUCxOUsSTd4hco0/9nxxlyOuijcsa6YV8l9NL6eqhniWbSyxCJT8ka5Mb7yAiUZe69EDLBQ== dependencies: eventemitter3 "4.0.4" @@ -21825,28 +26043,17 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz#dd6d855256c4dd681434fe0867f8cd742fe10503" - integrity sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.9" - web3-providers-http "1.2.9" - web3-providers-ipc "1.2.9" - web3-providers-ws "1.2.9" - -web3-core-requestmanager@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.4.tgz#e105ced735c2b5fcedd5771e0ecf9879ae9c373f" - integrity sha512-xriouCrhVnVDYQ04TZXdEREZm0OOJzkSEsoN5bu4JYsA6e/HzROeU+RjDpMUxFMzN4wxmFZ+HWbpPndS3QwMag== +web3-core-requestmanager@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.5.tgz#c452ea85fcffdf5b82b84c250707b638790d0e75" + integrity sha512-9l294U3Ga8qmvv8E37BqjQREfMs+kFnkU3PY28g9DZGYzKvl3V1dgDYqxyrOBdCFhc7rNSpHdgC4PrVHjouspg== dependencies: underscore "1.9.1" util "^0.12.0" - web3-core-helpers "1.3.4" - web3-providers-http "1.3.4" - web3-providers-ipc "1.3.4" - web3-providers-ws "1.3.4" + web3-core-helpers "1.3.5" + web3-providers-http "1.3.5" + web3-providers-ipc "1.3.5" + web3-providers-ws "1.3.5" web3-core-subscriptions@1.2.11: version "1.2.11" @@ -21857,23 +26064,14 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz#335fd7d15dfce5d78b4b7bef05ce4b3d7237b0e4" - integrity sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.9" - -web3-core-subscriptions@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.4.tgz#7b00e92bde21f792620cd02e6e508fcf4f4c31d3" - integrity sha512-drVHVDxh54hv7xmjIm44g4IXjfGj022fGw4/meB5R2D8UATFI40F73CdiBlyqk3DysP9njDOLTJFSQvEkLFUOg== +web3-core-subscriptions@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.5.tgz#7c4dc9d559e344d852de2cf01bd0cc13c94023cb" + integrity sha512-6mtXdaEB1V1zKLqYBq7RF2W75AK5ZJNGpW6QYC7Zvbku7zq1ZlgaUkJo88JKMWJ7etfaHaYqQ/7VveHk5sQynA== dependencies: eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.3.4" + web3-core-helpers "1.3.5" web3-core@1.2.11: version "1.2.11" @@ -21888,31 +26086,18 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.9.tgz#2cba57aa259b6409db532d21bdf57db8d504fd3e" - integrity sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA== - dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.9" - web3-core-method "1.2.9" - web3-core-requestmanager "1.2.9" - web3-utils "1.2.9" - -web3-core@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.4.tgz#2cc7ba7f35cc167f7a0a46fd5855f86e51d34ce8" - integrity sha512-7OJu46RpCEfTerl+gPvHXANR2RkLqAfW7l2DAvQ7wN0pnCzl9nEfdgW6tMhr31k3TR2fWucwKzCyyxMGzMHeSA== +web3-core@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.5.tgz#1e9335e6c4549dac09aaa07157242ebd6d097226" + integrity sha512-VQjTvnGTqJwDwjKEHSApea3RmgtFGLDSJ6bqrOyHROYNyTyKYjFQ/drG9zs3rjDkND9mgh8foI1ty37Qua3QCQ== dependencies: "@types/bn.js" "^4.11.5" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.3.4" - web3-core-method "1.3.4" - web3-core-requestmanager "1.3.4" - web3-utils "1.3.4" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-requestmanager "1.3.5" + web3-utils "1.3.5" web3-eth-abi@1.2.11: version "1.2.11" @@ -21932,23 +26117,14 @@ web3-eth-abi@1.2.5: underscore "1.9.1" web3-utils "1.2.5" -web3-eth-abi@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.9.tgz#14bedd7e4be04fcca35b2ac84af1400574cd8280" - integrity sha512-3YwUYbh/DMfDbhMWEebAdjSd5bj3ZQieOjLzWFHU23CaLEqT34sUix1lba+hgUH/EN6A7bKAuKOhR3p0OvTn7Q== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.9" - -web3-eth-abi@1.3.4, web3-eth-abi@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.4.tgz#10f5d8b6080dbb6cbaa1bcef7e0c70573da6566f" - integrity sha512-PVSLXJ2dzdXsC+R24llIIEOS6S1KhG5qwNznJjJvXZFe3sqgdSe47eNvwUamZtCBjcrdR/HQr+L/FTxqJSf80Q== +web3-eth-abi@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.5.tgz#eeffab0a4b318c47b8777de90983ca45614f8173" + integrity sha512-bkbG2v/mOW5DH6rF/SEgqunusjYoEi2IBw+fkmD3rzWDaEY7+/i1xY94AeO257d06QMgld75GtV/N+aEs7A6vQ== dependencies: "@ethersproject/abi" "5.0.7" underscore "1.9.1" - web3-utils "1.3.4" + web3-utils "1.3.5" web3-eth-accounts@1.2.11: version "1.2.11" @@ -21967,22 +26143,22 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz#7ec422df90fecb5243603ea49dc28726db7bdab6" - integrity sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg== +web3-eth-accounts@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.5.tgz#c23ee748759a6a06d6485a9322b106baa944dcdd" + integrity sha512-r3WOR21rgm6Cd6OFnifr3Tizdm5K+g2TsSOPySwX4FrgLrYDL6ck4zr5VXUPz+llpSExb/JztpE8pqEHr3U2NA== dependencies: crypto-browserify "3.12.0" - eth-lib "^0.2.8" + 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.9" - web3-core-helpers "1.2.9" - web3-core-method "1.2.9" - web3-utils "1.2.9" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-utils "1.3.5" web3-eth-contract@1.2.11: version "1.2.11" @@ -21999,35 +26175,20 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz#713d9c6d502d8c8f22b696b7ffd8e254444e6bfd" - integrity sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q== - dependencies: - "@types/bn.js" "^4.11.4" - underscore "1.9.1" - web3-core "1.2.9" - web3-core-helpers "1.2.9" - web3-core-method "1.2.9" - web3-core-promievent "1.2.9" - web3-core-subscriptions "1.2.9" - web3-eth-abi "1.2.9" - web3-utils "1.2.9" - -web3-eth-contract@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.4.tgz#1ea2dd71be0c4a9cf4772d4f75dbb2fa99751472" - integrity sha512-Fvy8ZxUksQY2ePt+XynFfOiSqxgQtMn4m2NJs6VXRl2Inl17qyRi/nIJJVKTcENLocm+GmZ/mxq2eOE5u02nPg== +web3-eth-contract@1.3.5, web3-eth-contract@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.5.tgz#b41ecf8612b379c4fb1c614e950135717aa8f919" + integrity sha512-WfGVeQquN3D7Qm+KEIN9EI7yrm/fL2V9Y4+YhDWiKA/ns1pX1LYcEWojTOnBXCnPF3tcvoKKL+KBxXg1iKm38A== dependencies: "@types/bn.js" "^4.11.5" underscore "1.9.1" - web3-core "1.3.4" - web3-core-helpers "1.3.4" - web3-core-method "1.3.4" - web3-core-promievent "1.3.4" - web3-core-subscriptions "1.3.4" - web3-eth-abi "1.3.4" - web3-utils "1.3.4" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-promievent "1.3.5" + web3-core-subscriptions "1.3.5" + web3-eth-abi "1.3.5" + web3-utils "1.3.5" web3-eth-ens@1.2.11: version "1.2.11" @@ -22044,20 +26205,20 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz#577b9358c036337833fb2bdc59c11be7f6f731b6" - integrity sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ== +web3-eth-ens@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.5.tgz#5a28d23eb402fb1f6964da60ea60641e4d24d366" + integrity sha512-5bkpFTXV18CvaVP8kCbLZZm2r1TWUv9AsXH+80yz8bTZulUGvXsBMRfK6e5nfEr2Yv59xlIXCFoalmmySI9EJw== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" underscore "1.9.1" - web3-core "1.2.9" - web3-core-helpers "1.2.9" - web3-core-promievent "1.2.9" - web3-eth-abi "1.2.9" - web3-eth-contract "1.2.9" - web3-utils "1.2.9" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-promievent "1.3.5" + web3-eth-abi "1.3.5" + web3-eth-contract "1.3.5" + web3-utils "1.3.5" web3-eth-iban@1.2.11: version "1.2.11" @@ -22067,21 +26228,13 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz#4ebf3d8783f34d04c4740dc18938556466399f7a" - integrity sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.9" - -web3-eth-iban@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.4.tgz#5eb7a564e0dcf68730d68f48f95dd207cd173d81" - integrity sha512-Y7/hLjVvIN/OhaAyZ8L/hxbTqVX6AFTl2RwUXR6EEU9oaLydPcMjAx/Fr8mghUvQS3QJSr+UGubP3W4SkyNiYw== +web3-eth-iban@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.5.tgz#dff1e37864e23a3387016ec4db96cdc290a6fbd6" + integrity sha512-x+BI/d2Vt0J1cKK8eFd4W0f1TDjgEOYCwiViTb28lLE+tqrgyPqWDA+l6UlKYLF/yMFX3Dym4ofcCOtgcn4q4g== dependencies: bn.js "^4.11.9" - web3-utils "1.3.4" + web3-utils "1.3.5" web3-eth-personal@1.2.11: version "1.2.11" @@ -22095,17 +26248,17 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz#9b95eb159b950b83cd8ae15873e1d57711b7a368" - integrity sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ== +web3-eth-personal@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.5.tgz#bc5d5b900bc4824139af2ef01eaf8e9855c644ba" + integrity sha512-xELQHNZ8p3VoO1582ghCaq+Bx7pSkOOalc6/ACOCGtHDMelqgVejrmSIZGScYl+k0HzngmQAzURZWQocaoGM1g== dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.9" - web3-core-helpers "1.2.9" - web3-core-method "1.2.9" - web3-net "1.2.9" - web3-utils "1.2.9" + "@types/node" "^12.12.6" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-net "1.3.5" + web3-utils "1.3.5" web3-eth@1.2.11: version "1.2.11" @@ -22126,24 +26279,24 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.9.tgz#e40e7b88baffc9b487193211c8b424dc944977b3" - integrity sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag== +web3-eth@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.5.tgz#2a3d0db870ef7921942a5d798ba0569175cc4de1" + integrity sha512-5qqDPMMD+D0xRqOV2ePU2G7/uQmhn0FgCEhFzKDMHrssDQJyQLW/VgfA0NLn64lWnuUrGnQStGvNxrWf7MgsfA== dependencies: underscore "1.9.1" - web3-core "1.2.9" - web3-core-helpers "1.2.9" - web3-core-method "1.2.9" - web3-core-subscriptions "1.2.9" - web3-eth-abi "1.2.9" - web3-eth-accounts "1.2.9" - web3-eth-contract "1.2.9" - web3-eth-ens "1.2.9" - web3-eth-iban "1.2.9" - web3-eth-personal "1.2.9" - web3-net "1.2.9" - web3-utils "1.2.9" + web3-core "1.3.5" + web3-core-helpers "1.3.5" + web3-core-method "1.3.5" + web3-core-subscriptions "1.3.5" + web3-eth-abi "1.3.5" + web3-eth-accounts "1.3.5" + web3-eth-contract "1.3.5" + web3-eth-ens "1.3.5" + web3-eth-iban "1.3.5" + web3-eth-personal "1.3.5" + web3-net "1.3.5" + web3-utils "1.3.5" web3-net@1.2.11: version "1.2.11" @@ -22154,14 +26307,14 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.9.tgz#51d248ed1bc5c37713c4ac40c0073d9beacd87d3" - integrity sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA== +web3-net@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.5.tgz#06e3465a9fbbeec1240160e2fd66ddb07b6af944" + integrity sha512-usbFbuUpKK8s7jPLGoUzi/WpNnefGFPTj948aJv8BZ04UQA4L/XS5NNkkhk358zNMmhGfEFW8wrWy+0Oy0njtA== dependencies: - web3-core "1.2.9" - web3-core-method "1.2.9" - web3-utils "1.2.9" + web3-core "1.3.5" + web3-core-method "1.3.5" + web3-utils "1.3.5" web3-provider-engine@14.2.1: version "14.2.1" @@ -22253,20 +26406,12 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.9.tgz#e698aa5377e2019c24c5a1e6efa0f51018728934" - integrity sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A== - dependencies: - web3-core-helpers "1.2.9" - xhr2-cookies "1.1.0" - -web3-providers-http@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.4.tgz#89389e18e27148faa2fef58842740ffadbdda8cc" - integrity sha512-aIg/xHXvxpqpFU70sqfp+JC3sGkLfAimRKTUhG4oJZ7U+tTcYTHoxBJj+4A3Id4JAoKiiv0k1/qeyQ8f3rMC3g== +web3-providers-http@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.5.tgz#cdada6fb342e08fd75aea249fceb6eee467beffc" + integrity sha512-ZQOmceFjcajEZdiuqciXjijwIYWNmEJ1oxMtbrwB2eGxHRCMXEH2xGRUZuhOFNF88yQC/VXVi14yvYg5ZlFJlA== dependencies: - web3-core-helpers "1.3.4" + web3-core-helpers "1.3.5" xhr2-cookies "1.1.0" web3-providers-ipc@1.2.11: @@ -22278,23 +26423,14 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz#6159eacfcd7ac31edc470d93ef10814fe874763b" - integrity sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.9" - -web3-providers-ipc@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.4.tgz#b963518989b1b7847063cdd461ff73b83855834a" - integrity sha512-E0CvXEJElr/TIlG1YfJeO3Le5NI/4JZM+1SsEdiPIfBUAJN18oOoum138EBGKv5+YaLKZUtUuJSXWjIIOR/0Ig== +web3-providers-ipc@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.5.tgz#2f5536abfe03f3824e00dedc614d8f46db72b57f" + integrity sha512-cbZOeb/sALiHjzMolJjIyHla/J5wdL2JKUtRO66Nh/uLALBCpU8JUgzNvpAdJ1ae3+A33+EdFStdzuDYHKtQew== dependencies: oboe "2.1.5" underscore "1.9.1" - web3-core-helpers "1.3.4" + web3-core-helpers "1.3.5" web3-providers-ws@1.2.11: version "1.2.11" @@ -22306,24 +26442,14 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz#22c2006655ec44b4ad2b41acae62741a6ae7a88c" - integrity sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA== - dependencies: - eventemitter3 "^4.0.0" - underscore "1.9.1" - web3-core-helpers "1.2.9" - websocket "^1.0.31" - -web3-providers-ws@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.4.tgz#b94c2e0ec51a0c472abdec53a472b5bf8176bec1" - integrity sha512-WBd9hk2fUAdrbA3kUyUk94ZeILtE6txLeoVVvIKAw2bPegx+RjkLyxC1Du0oceKgQ/qQWod8CCzl1E/GgTP+MQ== +web3-providers-ws@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.5.tgz#7f841ec79358d90c4a803d1291157b5ffb15aeb7" + integrity sha512-zeZ4LMvKhYaJBDCqA//Bzgp4r/T0tNq5U/xvN0axA4YflzF7yqlsbzGwCkcZYDbrUaK3Ltl2uOmvwjbWALOZ1A== dependencies: eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.3.4" + web3-core-helpers "1.3.5" websocket "^1.0.32" web3-shh@1.2.11: @@ -22336,15 +26462,15 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.9.tgz#c4ba70d6142cfd61341a50752d8cace9a0370911" - integrity sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA== +web3-shh@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.5.tgz#af0b8ebca90a3652dbbb90d351395f36ca91f40b" + integrity sha512-aRwzCduXvuGVslLL/Y15VcOHa70Qr2kxZI7UwOzQVhaaOdxuRRvo3AK/cmyln1Tsd54/n93Yk8I3qg5I2+6alw== dependencies: - web3-core "1.2.9" - web3-core-method "1.2.9" - web3-core-subscriptions "1.2.9" - web3-net "1.2.9" + web3-core "1.3.5" + web3-core-method "1.3.5" + web3-core-subscriptions "1.3.5" + web3-net "1.3.5" web3-utils@1.2.1: version "1.2.1" @@ -22387,24 +26513,10 @@ web3-utils@1.2.5: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.9.tgz#abe11735221627da943971ef1a630868fb9c61f3" - integrity sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - 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.3.4, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0, web3-utils@^1.3.3, web3-utils@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" - integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== +web3-utils@1.3.5, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0, web3-utils@^1.3.3, web3-utils@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e" + integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -22428,18 +26540,18 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.9.tgz#cbcf1c0fba5e213a6dfb1f2c1f4b37062e4ce337" - integrity sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA== +web3@1.3.5, web3@^1.2.6: + version "1.3.5" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.5.tgz#ef4c3a2241fdd74f2f7794e839f30bc6f9814e46" + integrity sha512-UyQW/MT5EIGBrXPCh/FDIaD7RtJTn5/rJUNw2FOglp0qoXnCQHNKvntiR1ylztk05fYxIF6UgsC76IrazlKJjw== dependencies: - web3-bzz "1.2.9" - web3-core "1.2.9" - web3-eth "1.2.9" - web3-eth-personal "1.2.9" - web3-net "1.2.9" - web3-shh "1.2.9" - web3-utils "1.2.9" + web3-bzz "1.3.5" + web3-core "1.3.5" + web3-eth "1.3.5" + web3-eth-personal "1.3.5" + web3-net "1.3.5" + web3-shh "1.3.5" + web3-utils "1.3.5" webidl-conversions@^4.0.2: version "4.0.2" @@ -22467,10 +26579,10 @@ webpack-dev-middleware@^3.7.2: 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== +webpack-dev-server@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" + integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -22492,11 +26604,11 @@ webpack-dev-server@3.11.0: p-retry "^3.0.1" portfinder "^1.0.26" schema-utils "^1.0.0" - selfsigned "^1.10.7" + selfsigned "^1.10.8" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" + sockjs "^0.3.21" + sockjs-client "^1.5.0" spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" @@ -22561,14 +26673,7 @@ webpack@4.44.2: watchpack "^1.7.4" webpack-sources "^1.4.1" -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: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -22595,9 +26700,9 @@ websocket@1.0.32: yaeti "^0.0.6" websocket@^1.0.31, websocket@^1.0.32: - version "1.0.33" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.33.tgz#407f763fc58e74a3fa41ca3ae5d78d3f5e3b82a5" - integrity sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA== + 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" @@ -22637,16 +26742,16 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== dependencies: - lodash.sortby "^4.7.0" + lodash "^4.7.0" tr46 "^2.0.2" webidl-conversions "^6.1.0" -which-boxed-primitive@^1.0.1: +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== @@ -22948,6 +27053,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + 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" @@ -23021,6 +27135,11 @@ ws@7.3.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -23044,10 +27163,10 @@ ws@^6.0.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.1, ws@^7.2.3, ws@^7.3.1: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== +ws@^7.1.0, ws@^7.2.1, ws@^7.3.1, ws@^7.4.4, ws@~7.4.2: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== xhr-request-promise@^0.1.2: version "0.1.3" @@ -23091,17 +27210,45 @@ xml-name-validator@^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== +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + 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.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz#dd6899bfbcf684b554e393c30b13b9f3b001a7ee" + integrity sha512-tYOaldF/0BLfKuoA39QMwD4j2m8lq4DIncqj1yuNELX4vz9+z/ieG/vwmctjJce+boFHXstqhWnHSxc4W8f4qg== + 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= -xss@^1.0.6: +xor-distance@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xor-distance/-/xor-distance-2.0.0.tgz#cad3920d3a1e3d73eeedc61a554e51972dae0798" + integrity sha512-AsAqZfPAuWx7qB/0kyRDUEvoU3QKsHWzHU9smFlkaiprEpGfJ/NBbLze2Uq0rdkxCxkNM9uOLvz/KoNBCbZiLQ== + +xsalsa20@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xsalsa20/-/xsalsa20-1.1.0.tgz#bee27174af1913aaec0fe677d8ba161ec12bf87d" + integrity sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw== + +xss@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.8.tgz#32feb87feb74b3dcd3d404b7a68ababf10700535" integrity sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw== @@ -23126,10 +27273,15 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== +"y18n@^3.2.1 || ^4.0.0", 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== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaeti@^0.0.6: version "0.0.6" @@ -23146,10 +27298,10 @@ yallist@^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.5.1, yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +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" @@ -23159,10 +27311,10 @@ yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.x, yargs-parser@^20.2.3: - version "20.2.6" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" - integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== yargs-parser@^10.0.0: version "10.1.0" @@ -23171,6 +27323,14 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^15.0.1: version "15.0.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" @@ -23245,6 +27405,24 @@ yargs@13.3.2, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.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 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^14.2.2: version "14.2.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" @@ -23262,7 +27440,7 @@ yargs@^14.2.2: y18n "^4.0.0" yargs-parser "^15.0.1" -yargs@^15.4.1: +yargs@^15.3.1, 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== @@ -23279,6 +27457,19 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -23299,6 +27490,11 @@ yargs@^4.7.1: y18n "^3.2.1" yargs-parser "^2.4.1" +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -23309,6 +27505,17 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yup@^0.31.1: + version "0.31.1" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.31.1.tgz#0954cb181161f397b804346037a04f8a4b31599e" + integrity sha512-Lf6648jDYOWR75IlWkVfwesPyW6oj+50NpxlKvsQlpPsB8eI+ndI7b4S1VrwbmeV9hIZDu1MzrlIL4W+gK1jPw== + dependencies: + "@babel/runtime" "^7.10.5" + lodash "^4.17.20" + lodash-es "^4.17.11" + property-expr "^2.0.4" + toposort "^2.0.2" + zen-observable-ts@^0.8.21: version "0.8.21" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" @@ -23317,7 +27524,7 @@ zen-observable-ts@^0.8.21: tslib "^1.9.3" zen-observable "^0.8.0" -zen-observable@^0.8.0: +zen-observable@^0.8.0, zen-observable@^0.8.14: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==