From 9ced1ce0fd93c2a2eefeec7df2bae41fb67e6f24 Mon Sep 17 00:00:00 2001 From: Matthew Russell Date: Tue, 22 Mar 2022 11:18:50 -0700 Subject: [PATCH 01/10] Fix/format price in order confirmation dialog (#102) --- .../deal-ticket-container/order-dialog.tsx | 17 +++++++++++++++-- apps/trading/hooks/use-order-submit.ts | 1 + libs/graphql/src/__generated__/OrderEvent.ts | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/apps/trading/components/deal-ticket-container/order-dialog.tsx b/apps/trading/components/deal-ticket-container/order-dialog.tsx index 09938a2b4..4d2bb25d8 100644 --- a/apps/trading/components/deal-ticket-container/order-dialog.tsx +++ b/apps/trading/components/deal-ticket-container/order-dialog.tsx @@ -4,7 +4,11 @@ import { TransactionState, VegaTxStatus, } from '../../hooks/use-vega-transaction'; -import { OrderEvent_busEvents_event_Order } from '@vegaprotocol/graphql'; +import { + OrderEvent_busEvents_event_Order, + OrderStatus, +} from '@vegaprotocol/graphql'; +import { formatNumber } from '@vegaprotocol/react-helpers'; interface OrderDialogProps { transaction: TransactionState; @@ -66,8 +70,17 @@ export const OrderDialog = ({ >

Status: {finalizedOrder.status}

Market: {finalizedOrder.market.name}

+

Type: {finalizedOrder.type}

Amount: {finalizedOrder.size}

- {finalizedOrder.type === 'Limit' &&

Price: {finalizedOrder.price}

} + {finalizedOrder.type === 'Limit' && ( +

+ Price:{' '} + {formatNumber( + finalizedOrder.price, + finalizedOrder.market.decimalPlaces + )} +

+ )} ); }; diff --git a/apps/trading/hooks/use-order-submit.ts b/apps/trading/hooks/use-order-submit.ts index c81a61062..2063d3079 100644 --- a/apps/trading/hooks/use-order-submit.ts +++ b/apps/trading/hooks/use-order-submit.ts @@ -29,6 +29,7 @@ const ORDER_EVENT_SUB = gql` price market { name + decimalPlaces } } } diff --git a/libs/graphql/src/__generated__/OrderEvent.ts b/libs/graphql/src/__generated__/OrderEvent.ts index 9d93b9fbf..b5ff01623 100644 --- a/libs/graphql/src/__generated__/OrderEvent.ts +++ b/libs/graphql/src/__generated__/OrderEvent.ts @@ -19,6 +19,23 @@ export interface OrderEvent_busEvents_event_Order_market { * Market full name */ name: string; + /** + * decimalPlaces indicates the number of decimal places that an integer must be shifted by in order to get a correct + * number denominated in the currency of the Market. (uint64) + * + * Examples: + * Currency Balance decimalPlaces Real Balance + * GBP 100 0 GBP 100 + * GBP 100 2 GBP 1.00 + * GBP 100 4 GBP 0.01 + * GBP 1 4 GBP 0.0001 ( 0.01p ) + * + * GBX (pence) 100 0 GBP 1.00 (100p ) + * GBX (pence) 100 2 GBP 0.01 ( 1p ) + * GBX (pence) 100 4 GBP 0.0001 ( 0.01p ) + * GBX (pence) 1 4 GBP 0.000001 ( 0.0001p) + */ + decimalPlaces: number; } export interface OrderEvent_busEvents_event_Order { From ae37f76b1c63293747bcdcbc7143f268ebdce36f Mon Sep 17 00:00:00 2001 From: Dexter Edwards Date: Wed, 23 Mar 2022 09:57:51 +0000 Subject: [PATCH 02/10] Search implementation (#97) * make titles look prettier * link to parties from transactions table * render what data is found conditionally * more syntax highlighting * re-jig file orders * remove footer component for now * add subheading component * adjust column layout * Style up header * enable ligatures * change env files * fix error if data is null * show governance header even if there is no data * remove dead css * add dark theme for block explorer * use memo on parties submit * remove some css from header * basic search implementation * allow passing classNames to form group * add tests for form group * add form-grpup stories * bad rebase fixes * add link * tidy up tests * fix tests * tidy up env files * final test fixes * switch order of classes * fix test id * force build for testing * rename file for linting * add tests for header component * rename export * input error tests * use descriptive function names as per PR comment * fix casing issue for CI * handle empty state * make query easier to understand --- apps/explorer-e2e/.env.devent | 20 --- apps/explorer-e2e/.env.mainnet | 21 --- apps/explorer-e2e/.env.stagnet1 | 21 --- apps/explorer-e2e/.env.stagnet2 | 20 --- apps/explorer-e2e/.env.testnet | 20 --- .../src/support/pages/network-page.js | 2 +- .../src/support/pages/transactions-page.js | 2 +- apps/explorer/.env | 7 - apps/explorer/.env.devent | 29 ---- apps/explorer/.env.local | 14 ++ apps/explorer/.env.mainnet | 29 ---- apps/explorer/.env.stagnet1 | 30 ---- apps/explorer/.env.stagnet2 | 29 ---- apps/explorer/.env.testnet | 29 ---- apps/explorer/jest.config.js | 2 +- apps/explorer/src/app/App.scss | 14 +- apps/explorer/src/app/app.spec.tsx | 2 +- apps/explorer/src/app/app.tsx | 2 - .../src/app/components/footer/index.tsx | 15 -- .../src/app/components/header/header.spec.tsx | 28 ++++ .../src/app/components/header/header.tsx | 12 ++ .../src/app/components/header/index.tsx | 10 +- .../app/components/jump-to-block/index.tsx | 13 +- .../src/app/components/route-title/index.tsx | 16 +- .../src/app/components/search/index.tsx | 109 +------------- .../src/app/components/search/search.spec.tsx | 140 ++++++++++++++++++ .../src/app/components/search/search.tsx | 84 +++++++++++ .../src/app/components/sub-heading/index.tsx | 27 ++++ .../txs/{home => }/block-txs-data.tsx | 6 +- .../explorer/src/app/components/txs/index.tsx | 7 +- .../components/txs/{pending => }/tx-list.tsx | 2 +- .../index.tsx => tx-order-type.tsx} | 0 .../index.tsx => txs-per-block.tsx} | 65 ++++---- apps/explorer/src/app/hooks/use-fetch.tsx | 2 +- apps/explorer/src/app/routes/assets/index.tsx | 8 +- .../src/app/routes/blocks/id/index.tsx | 2 +- .../explorer/src/app/routes/genesis/index.tsx | 3 +- .../src/app/routes/governance/index.tsx | 11 +- .../explorer/src/app/routes/markets/index.tsx | 21 ++- .../app/routes/network-parameters/index.tsx | 8 +- .../src/app/routes/parties/home/index.tsx | 56 ++++++- .../src/app/routes/parties/id/index.tsx | 27 +++- .../explorer/src/app/routes/pending/index.tsx | 5 +- apps/explorer/src/app/routes/txs/id/index.tsx | 3 +- .../txs/id/tx-content.tsx | 13 +- .../txs/id/tx-details.tsx | 9 +- .../src/app/routes/validators/index.tsx | 25 +++- .../src/app/{setupTests.ts => setup-tests.ts} | 0 apps/explorer/src/app/styles/_reset.scss | 6 - apps/explorer/src/index.html | 2 +- apps/explorer/tsconfig.spec.json | 2 +- libs/ui-toolkit/jest.config.js | 1 + .../components/callout/callout.stories.tsx | 5 + .../src/components/callout/callout.test.tsx | 1 - .../etherscan-link/etherscan-link.test.tsx | 1 - .../components/form-group/form-group.spec.tsx | 32 ++++ .../src/components/form-group/form-group.tsx | 32 ++++ .../form-group/from-group.stories.tsx | 30 ++++ .../src/components/form-group/index.tsx | 31 +--- .../components/input-error/input-error.tsx | 6 +- libs/ui-toolkit/src/setup-tests.ts | 5 + 61 files changed, 639 insertions(+), 535 deletions(-) create mode 100644 apps/explorer/.env.local delete mode 100644 apps/explorer/src/app/components/footer/index.tsx create mode 100644 apps/explorer/src/app/components/header/header.spec.tsx create mode 100644 apps/explorer/src/app/components/header/header.tsx create mode 100644 apps/explorer/src/app/components/search/search.spec.tsx create mode 100644 apps/explorer/src/app/components/search/search.tsx create mode 100644 apps/explorer/src/app/components/sub-heading/index.tsx rename apps/explorer/src/app/components/txs/{home => }/block-txs-data.tsx (83%) rename apps/explorer/src/app/components/txs/{pending => }/tx-list.tsx (83%) rename apps/explorer/src/app/components/txs/{tx-order-type/index.tsx => tx-order-type.tsx} (100%) rename apps/explorer/src/app/components/txs/{txs-per-block/index.tsx => txs-per-block.tsx} (50%) rename apps/explorer/src/app/{components => routes}/txs/id/tx-content.tsx (73%) rename apps/explorer/src/app/{components => routes}/txs/id/tx-details.tsx (91%) rename apps/explorer/src/app/{setupTests.ts => setup-tests.ts} (100%) delete mode 100644 apps/explorer/src/app/styles/_reset.scss create mode 100644 libs/ui-toolkit/src/components/form-group/form-group.spec.tsx create mode 100644 libs/ui-toolkit/src/components/form-group/form-group.tsx create mode 100644 libs/ui-toolkit/src/components/form-group/from-group.stories.tsx create mode 100644 libs/ui-toolkit/src/setup-tests.ts diff --git a/apps/explorer-e2e/.env.devent b/apps/explorer-e2e/.env.devent index a852aa565..996011a8e 100644 --- a/apps/explorer-e2e/.env.devent +++ b/apps/explorer-e2e/.env.devent @@ -1,23 +1,3 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n04.d.vega.xyz/tm" diff --git a/apps/explorer-e2e/.env.mainnet b/apps/explorer-e2e/.env.mainnet index 9fedccbba..13b74ef15 100644 --- a/apps/explorer-e2e/.env.mainnet +++ b/apps/explorer-e2e/.env.mainnet @@ -1,23 +1,3 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://mainnet-observer-proxy01.ops.vega.xyz/" @@ -28,7 +8,6 @@ NX_VEGA_URL = "https://api.token.vega.xyz/query" NX_EXPLORER_ASSETS = 1 NX_EXPLORER_GENESIS = 1 NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 NX_EXPLORER_NETWORK_PARAMETERS = 1 NX_EXPLORER_PARTIES = 1 NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer-e2e/.env.stagnet1 b/apps/explorer-e2e/.env.stagnet1 index 3abca14e7..871afdc6d 100644 --- a/apps/explorer-e2e/.env.stagnet1 +++ b/apps/explorer-e2e/.env.stagnet1 @@ -1,30 +1,9 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n03.s.vega.xyz/tm" NX_TENDERMINT_WEBSOCKET_URL = "wss://n03.s.vega.xyz/tm/websocket" NX_VEGA_URL = "https://n03.s.vega.xyz/query" - # App flags NX_EXPLORER_ASSETS = 1 NX_EXPLORER_GENESIS = 1 diff --git a/apps/explorer-e2e/.env.stagnet2 b/apps/explorer-e2e/.env.stagnet2 index 5499a2a6b..e4cbaab0d 100644 --- a/apps/explorer-e2e/.env.stagnet2 +++ b/apps/explorer-e2e/.env.stagnet2 @@ -1,23 +1,3 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n03.stagnet2.vega.xyz/tm" diff --git a/apps/explorer-e2e/.env.testnet b/apps/explorer-e2e/.env.testnet index 56370f422..5b296d196 100644 --- a/apps/explorer-e2e/.env.testnet +++ b/apps/explorer-e2e/.env.testnet @@ -1,23 +1,3 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://lb.testnet.vega.xyz/tm" diff --git a/apps/explorer-e2e/src/support/pages/network-page.js b/apps/explorer-e2e/src/support/pages/network-page.js index faa2b0d32..963e0e1ad 100644 --- a/apps/explorer-e2e/src/support/pages/network-page.js +++ b/apps/explorer-e2e/src/support/pages/network-page.js @@ -7,7 +7,7 @@ export default class NetworkParametersPage extends BasePage { verifyNetworkParametersDisplayed() { cy.getByTestId(this.networkParametersHeader).should( 'have.text', - 'NetworkParameters' + 'Network Parameters' ); cy.getByTestId(this.parameters).should('not.be.empty'); } diff --git a/apps/explorer-e2e/src/support/pages/transactions-page.js b/apps/explorer-e2e/src/support/pages/transactions-page.js index c7187c364..da8d4e47f 100644 --- a/apps/explorer-e2e/src/support/pages/transactions-page.js +++ b/apps/explorer-e2e/src/support/pages/transactions-page.js @@ -77,6 +77,6 @@ export default class TransactionsPage extends BasePage { } clickOnTopTransaction() { - cy.getByTestId(this.transactionRow).first().find('a').click(); + cy.getByTestId(this.transactionRow).first().find('a').first().click(); } } diff --git a/apps/explorer/.env b/apps/explorer/.env index 56370f422..123a0c798 100644 --- a/apps/explorer/.env +++ b/apps/explorer/.env @@ -18,17 +18,10 @@ NX_URL=$URL NX_DEPLOY_URL=$DEPLOY_URL NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL -# App configuration variables -NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" -NX_TENDERMINT_URL = "https://lb.testnet.vega.xyz/tm" -NX_TENDERMINT_WEBSOCKET_URL = "wss://lb.testnet.vega.xyz/tm/websocket" -NX_VEGA_URL = "https://lb.testnet.vega.xyz/query" - # App flags NX_EXPLORER_ASSETS = 1 NX_EXPLORER_GENESIS = 1 NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 NX_EXPLORER_NETWORK_PARAMETERS = 1 NX_EXPLORER_PARTIES = 1 NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.devent b/apps/explorer/.env.devent index a852aa565..3af139aa8 100644 --- a/apps/explorer/.env.devent +++ b/apps/explorer/.env.devent @@ -1,34 +1,5 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n04.d.vega.xyz/tm" NX_TENDERMINT_WEBSOCKET_URL = "wss://n04.d.vega.xyz/tm/websocket" NX_VEGA_URL = "https://n04.d.vega.xyz/query" - -# App flags -NX_EXPLORER_ASSETS = 1 -NX_EXPLORER_GENESIS = 1 -NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 -NX_EXPLORER_NETWORK_PARAMETERS = 1 -NX_EXPLORER_PARTIES = 1 -NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.local b/apps/explorer/.env.local new file mode 100644 index 000000000..5b296d196 --- /dev/null +++ b/apps/explorer/.env.local @@ -0,0 +1,14 @@ +# App configuration variables +NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" +NX_TENDERMINT_URL = "https://lb.testnet.vega.xyz/tm" +NX_TENDERMINT_WEBSOCKET_URL = "wss://lb.testnet.vega.xyz/tm/websocket" +NX_VEGA_URL = "https://lb.testnet.vega.xyz/query" + +# App flags +NX_EXPLORER_ASSETS = 1 +NX_EXPLORER_GENESIS = 1 +NX_EXPLORER_GOVERNANCE = 1 +NX_EXPLORER_MARKETS = 1 +NX_EXPLORER_NETWORK_PARAMETERS = 1 +NX_EXPLORER_PARTIES = 1 +NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.mainnet b/apps/explorer/.env.mainnet index 9fedccbba..ad8c0ef9d 100644 --- a/apps/explorer/.env.mainnet +++ b/apps/explorer/.env.mainnet @@ -1,34 +1,5 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://mainnet-observer-proxy01.ops.vega.xyz/" NX_TENDERMINT_WEBSOCKET_URL = "wss://mainnet-observer-proxy01.ops.vega.xyz/websocket" NX_VEGA_URL = "https://api.token.vega.xyz/query" - -# App flags -NX_EXPLORER_ASSETS = 1 -NX_EXPLORER_GENESIS = 1 -NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 -NX_EXPLORER_NETWORK_PARAMETERS = 1 -NX_EXPLORER_PARTIES = 1 -NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.stagnet1 b/apps/explorer/.env.stagnet1 index 3abca14e7..83cda47ac 100644 --- a/apps/explorer/.env.stagnet1 +++ b/apps/explorer/.env.stagnet1 @@ -1,35 +1,5 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n03.s.vega.xyz/tm" NX_TENDERMINT_WEBSOCKET_URL = "wss://n03.s.vega.xyz/tm/websocket" NX_VEGA_URL = "https://n03.s.vega.xyz/query" - - -# App flags -NX_EXPLORER_ASSETS = 1 -NX_EXPLORER_GENESIS = 1 -NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 -NX_EXPLORER_NETWORK_PARAMETERS = 1 -NX_EXPLORER_PARTIES = 1 -NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.stagnet2 b/apps/explorer/.env.stagnet2 index 5499a2a6b..05b15b546 100644 --- a/apps/explorer/.env.stagnet2 +++ b/apps/explorer/.env.stagnet2 @@ -1,34 +1,5 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://n03.stagnet2.vega.xyz/tm" NX_TENDERMINT_WEBSOCKET_URL = "wss://n03.stagnet2.vega.xyz/tm/websocket" NX_VEGA_URL = "https://n03.stagnet2.vega.xyz/query" - -# App flags -NX_EXPLORER_ASSETS = 1 -NX_EXPLORER_GENESIS = 1 -NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 -NX_EXPLORER_NETWORK_PARAMETERS = 1 -NX_EXPLORER_PARTIES = 1 -NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/.env.testnet b/apps/explorer/.env.testnet index 56370f422..5218200b8 100644 --- a/apps/explorer/.env.testnet +++ b/apps/explorer/.env.testnet @@ -1,34 +1,5 @@ -# React Environment Variables -# https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env - -# Netlify Environment Variables -# https://www.netlify.com/docs/continuous-deployment/#environment-variables -NX_VERSION=$npm_package_version -NX_REPOSITORY_URL=$REPOSITORY_URL -NX_BRANCH=$BRANCH -NX_PULL_REQUEST=$PULL_REQUEST -NX_HEAD=$HEAD -NX_COMMIT_REF=$COMMIT_REF -NX_CONTEXT=$CONTEXT -NX_REVIEW_ID=$REVIEW_ID -NX_INCOMING_HOOK_TITLE=$INCOMING_HOOK_TITLE -NX_INCOMING_HOOK_URL=$INCOMING_HOOK_URL -NX_INCOMING_HOOK_BODY=$INCOMING_HOOK_BODY -NX_URL=$URL -NX_DEPLOY_URL=$DEPLOY_URL -NX_DEPLOY_PRIME_URL=$DEPLOY_PRIME_URL - # App configuration variables NX_CHAIN_EXPLORER_URL = "https://explorer.vega.trading/.netlify/functions/chain-explorer-api" NX_TENDERMINT_URL = "https://lb.testnet.vega.xyz/tm" NX_TENDERMINT_WEBSOCKET_URL = "wss://lb.testnet.vega.xyz/tm/websocket" NX_VEGA_URL = "https://lb.testnet.vega.xyz/query" - -# App flags -NX_EXPLORER_ASSETS = 1 -NX_EXPLORER_GENESIS = 1 -NX_EXPLORER_GOVERNANCE = 1 -NX_EXPLORER_MARKETS = 1 -NX_EXPLORER_NETWORK_PARAMETERS = 1 -NX_EXPLORER_PARTIES = 1 -NX_EXPLORER_VALIDATORS = 1 diff --git a/apps/explorer/jest.config.js b/apps/explorer/jest.config.js index fcdba1f33..21c4b37c8 100644 --- a/apps/explorer/jest.config.js +++ b/apps/explorer/jest.config.js @@ -7,5 +7,5 @@ module.exports = { }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], coverageDirectory: '../../coverage/apps/explorer', - setupFilesAfterEnv: ['./src/app/setupTests.ts'], + setupFilesAfterEnv: ['./src/app/setup-tests.ts'], }; diff --git a/apps/explorer/src/app/App.scss b/apps/explorer/src/app/App.scss index 5f7344309..bc35c4932 100644 --- a/apps/explorer/src/app/App.scss +++ b/apps/explorer/src/app/App.scss @@ -1,6 +1,5 @@ @import './styles/colors'; @import './styles/fonts'; -@import './styles/reset'; html, body, @@ -39,18 +38,23 @@ body, padding: 20px; grid-column-start: 1; grid-column-end: 1; - grid-row-start: 1; + grid-row-start: 2; grid-row-end: 3; overflow: hidden; } header { - padding: 20px; border-bottom: 1px solid $white; - grid-column-start: 2; - grid-column-end: 2; + grid-column-start: 1; + grid-column-end: 3; grid-row-start: 1; grid-row-end: 2; + + h1 { + font-family: $font-alpa-lyrae; + font-feature-settings: 'calt'; + text-transform: uppercase; + } } main { diff --git a/apps/explorer/src/app/app.spec.tsx b/apps/explorer/src/app/app.spec.tsx index 680a016a5..6bccbf1c8 100644 --- a/apps/explorer/src/app/app.spec.tsx +++ b/apps/explorer/src/app/app.spec.tsx @@ -1,4 +1,4 @@ -import App from './App'; +import App from './app'; describe('App', () => { it('should exist', () => { diff --git a/apps/explorer/src/app/app.tsx b/apps/explorer/src/app/app.tsx index 770f5752a..c23ed5385 100644 --- a/apps/explorer/src/app/app.tsx +++ b/apps/explorer/src/app/app.tsx @@ -4,7 +4,6 @@ import { ApolloProvider } from '@apollo/client'; import { createClient } from './lib/apollo-client'; import { Nav } from './components/nav'; -import { Footer } from './components/footer'; import { Header } from './components/header'; import { Main } from './components/main'; import React from 'react'; @@ -24,7 +23,6 @@ function App() { diff --git a/apps/explorer/src/app/routes/router-config.tsx b/apps/explorer/src/app/routes/router-config.tsx index af048e084..a67587755 100644 --- a/apps/explorer/src/app/routes/router-config.tsx +++ b/apps/explorer/src/app/routes/router-config.tsx @@ -34,6 +34,7 @@ const partiesRoutes = flags.parties { path: Routes.PARTIES, name: 'Parties', + text: 'Parties', element: , children: [ { @@ -53,6 +54,7 @@ const assetsRoutes = flags.assets ? [ { path: Routes.ASSETS, + text: 'Assets', name: 'Assets', element: , }, @@ -64,6 +66,7 @@ const genesisRoutes = flags.genesis { path: Routes.GENESIS, name: 'Genesis', + text: 'Genesis Parameters', element: , }, ] @@ -74,6 +77,7 @@ const governanceRoutes = flags.governance { path: Routes.GOVERNANCE, name: 'Governance', + text: 'Proposals', element: , }, ] @@ -84,6 +88,7 @@ const marketsRoutes = flags.markets { path: Routes.MARKETS, name: 'Markets', + text: 'Markets', element: , }, ] @@ -94,6 +99,7 @@ const networkParametersRoutes = flags.networkParameters { path: Routes.NETWORK_PARAMETERS, name: 'NetworkParameters', + text: 'Network Parameters', element: , }, ] @@ -103,6 +109,7 @@ const validators = flags.validators { path: Routes.VALIDATORS, name: 'Validators', + text: 'Validators', element: , }, ] @@ -112,12 +119,14 @@ const routerConfig = [ { path: Routes.HOME, name: 'Home', + text: 'Home', element: , index: true, }, { path: Routes.TX, name: 'Txs', + text: 'Transactions', element: , children: [ { @@ -137,6 +146,7 @@ const routerConfig = [ { path: Routes.BLOCKS, name: 'Blocks', + text: 'Blocks', element: , children: [ { From 05d53bbf4ced9d25f018d1a4c6fac9db12bacfc4 Mon Sep 17 00:00:00 2001 From: Sam Keen Date: Wed, 23 Mar 2022 17:40:15 +0000 Subject: [PATCH 05/10] 106 - migrate mainnet stats to monorepo (#107) * Initial commit of generated mainnet-stats directory * Migration partly complete * Migration complete * Vega logo now in ui toolkit * Specified a port that stops conflicts with other e2e tests * Extra config for swapping to port that stops conflicts with other e2e tests. Also file name case change * Adding the Cypress project ID to allow recording * fix test * Mainnet stats manager moved into library * Mainnet stats project now importing manager element from lib * Block Explorer has mainnet stats on home route * Styling tweak to stop mainnet stats tables trying to match heights * Spacing alignment tweaks * Changing header text and tests to align with other branches * Correct header test for mainnet-stats app * Correct h3 test for mainnet-stats app * Fix linting issue * fix casing issue for CI * Corrected mistake in merge Co-authored-by: Dexter --- .../src/support/pages/base-page.js | 2 +- apps/explorer/src/app/routes/home/index.tsx | 4 +- apps/stats-mainnet-e2e/.eslintrc.json | 10 + apps/stats-mainnet-e2e/cypress.json | 14 ++ apps/stats-mainnet-e2e/project.json | 28 +++ .../src/fixtures/example.json | 4 + .../src/integration/app.spec.ts | 7 + .../stats-mainnet-e2e/src/support/commands.ts | 33 ++++ apps/stats-mainnet-e2e/src/support/index.ts | 17 ++ apps/stats-mainnet-e2e/tsconfig.json | 10 + apps/stats-mainnet/.babelrc | 11 ++ apps/stats-mainnet/.browserslistrc | 16 ++ apps/stats-mainnet/.eslintrc.json | 18 ++ apps/stats-mainnet/jest.config.js | 10 + apps/stats-mainnet/postcss.config.js | 10 + apps/stats-mainnet/project.json | 74 ++++++++ apps/stats-mainnet/src/app.tsx | 24 +++ .../src/assets/apple-touch-icon.png | Bin 0 -> 1405 bytes apps/stats-mainnet/src/assets/favicon.ico | Bin 0 -> 7406 bytes apps/stats-mainnet/src/assets/logo.png | Bin 0 -> 547 bytes apps/stats-mainnet/src/assets/logo192.png | Bin 0 -> 1517 bytes apps/stats-mainnet/src/assets/manifest.json | 20 ++ apps/stats-mainnet/src/assets/robots.txt | 3 + .../src/components/header/header.tsx | 32 ++++ .../src/components/header/index.ts | 1 + .../components/images/dark-mode-toggle.tsx | 18 ++ .../src/components/images/index.ts | 2 + .../components/images/light-mode-toggle.tsx | 10 + .../src/components/videos/index.ts | 1 + .../videos/vega-background-video.tsx | 16 ++ apps/stats-mainnet/src/config/types.ts | 4 + apps/stats-mainnet/src/index.html | 52 ++++++ apps/stats-mainnet/src/main.tsx | 17 ++ apps/stats-mainnet/src/polyfills.ts | 7 + apps/stats-mainnet/src/react-app-env.d.ts | 1 + apps/stats-mainnet/src/reportWebVitals.ts | 15 ++ apps/stats-mainnet/src/setupTests.ts | 5 + .../src/styles/AlphaLyrae-Medium.woff | Bin 0 -> 131420 bytes apps/stats-mainnet/src/styles/styles.css | 39 ++++ apps/stats-mainnet/tailwind.config.js | 12 ++ apps/stats-mainnet/tsconfig.app.json | 22 +++ apps/stats-mainnet/tsconfig.json | 25 +++ apps/stats-mainnet/tsconfig.spec.json | 23 +++ libs/mainnet-stats-manager/.babelrc | 12 ++ libs/mainnet-stats-manager/.eslintrc.json | 18 ++ libs/mainnet-stats-manager/README.md | 7 + libs/mainnet-stats-manager/jest.config.js | 9 + libs/mainnet-stats-manager/package.json | 4 + libs/mainnet-stats-manager/project.json | 43 +++++ .../good-threshold-indicator.tsx | 21 +++ .../good-threshold-indicator/index.ts | 1 + .../components/promoted-stats-item/index.ts | 1 + .../promoted-stats-item.tsx | 26 +++ .../src/components/promoted-stats/index.ts | 1 + .../promoted-stats/promoted-stats.tsx | 13 ++ .../src/components/stats-manager/index.ts | 1 + .../stats-manager/stats-manager.tsx | 120 ++++++++++++ .../src/components/table-row/index.ts | 1 + .../src/components/table-row/table-row.tsx | 28 +++ .../src/components/table/index.ts | 1 + .../src/components/table/table.tsx | 13 ++ .../src/components/tooltip/index.ts | 1 + .../src/components/tooltip/tooltip.tsx | 36 ++++ .../src/config/stats-fields.ts | 174 ++++++++++++++++++ .../mainnet-stats-manager/src/config/types.ts | 36 ++++ libs/mainnet-stats-manager/src/index.ts | 1 + libs/mainnet-stats-manager/tsconfig.json | 25 +++ libs/mainnet-stats-manager/tsconfig.lib.json | 22 +++ libs/mainnet-stats-manager/tsconfig.spec.json | 19 ++ libs/tailwindcss-config/src/theme.js | 6 +- .../src/components/vega-logo/index.ts | 1 + .../components/vega-logo/lozenge.stories.tsx | 11 ++ .../components/vega-logo/vega-logo.spec.tsx | 10 + .../src/components/vega-logo/vega-logo.tsx | 16 ++ libs/ui-toolkit/src/index.ts | 1 + package.json | 4 +- tsconfig.base.json | 3 + workspace.json | 3 + yarn.lock | 96 +++++++++- 79 files changed, 1397 insertions(+), 5 deletions(-) create mode 100644 apps/stats-mainnet-e2e/.eslintrc.json create mode 100644 apps/stats-mainnet-e2e/cypress.json create mode 100644 apps/stats-mainnet-e2e/project.json create mode 100644 apps/stats-mainnet-e2e/src/fixtures/example.json create mode 100644 apps/stats-mainnet-e2e/src/integration/app.spec.ts create mode 100644 apps/stats-mainnet-e2e/src/support/commands.ts create mode 100644 apps/stats-mainnet-e2e/src/support/index.ts create mode 100644 apps/stats-mainnet-e2e/tsconfig.json create mode 100644 apps/stats-mainnet/.babelrc create mode 100644 apps/stats-mainnet/.browserslistrc create mode 100644 apps/stats-mainnet/.eslintrc.json create mode 100644 apps/stats-mainnet/jest.config.js create mode 100644 apps/stats-mainnet/postcss.config.js create mode 100644 apps/stats-mainnet/project.json create mode 100644 apps/stats-mainnet/src/app.tsx create mode 100644 apps/stats-mainnet/src/assets/apple-touch-icon.png create mode 100644 apps/stats-mainnet/src/assets/favicon.ico create mode 100644 apps/stats-mainnet/src/assets/logo.png create mode 100644 apps/stats-mainnet/src/assets/logo192.png create mode 100644 apps/stats-mainnet/src/assets/manifest.json create mode 100644 apps/stats-mainnet/src/assets/robots.txt create mode 100644 apps/stats-mainnet/src/components/header/header.tsx create mode 100644 apps/stats-mainnet/src/components/header/index.ts create mode 100644 apps/stats-mainnet/src/components/images/dark-mode-toggle.tsx create mode 100644 apps/stats-mainnet/src/components/images/index.ts create mode 100644 apps/stats-mainnet/src/components/images/light-mode-toggle.tsx create mode 100644 apps/stats-mainnet/src/components/videos/index.ts create mode 100644 apps/stats-mainnet/src/components/videos/vega-background-video.tsx create mode 100644 apps/stats-mainnet/src/config/types.ts create mode 100644 apps/stats-mainnet/src/index.html create mode 100644 apps/stats-mainnet/src/main.tsx create mode 100644 apps/stats-mainnet/src/polyfills.ts create mode 100644 apps/stats-mainnet/src/react-app-env.d.ts create mode 100644 apps/stats-mainnet/src/reportWebVitals.ts create mode 100644 apps/stats-mainnet/src/setupTests.ts create mode 100644 apps/stats-mainnet/src/styles/AlphaLyrae-Medium.woff create mode 100644 apps/stats-mainnet/src/styles/styles.css create mode 100644 apps/stats-mainnet/tailwind.config.js create mode 100644 apps/stats-mainnet/tsconfig.app.json create mode 100644 apps/stats-mainnet/tsconfig.json create mode 100644 apps/stats-mainnet/tsconfig.spec.json create mode 100644 libs/mainnet-stats-manager/.babelrc create mode 100644 libs/mainnet-stats-manager/.eslintrc.json create mode 100644 libs/mainnet-stats-manager/README.md create mode 100644 libs/mainnet-stats-manager/jest.config.js create mode 100644 libs/mainnet-stats-manager/package.json create mode 100644 libs/mainnet-stats-manager/project.json create mode 100644 libs/mainnet-stats-manager/src/components/good-threshold-indicator/good-threshold-indicator.tsx create mode 100644 libs/mainnet-stats-manager/src/components/good-threshold-indicator/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/promoted-stats-item/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/promoted-stats-item/promoted-stats-item.tsx create mode 100644 libs/mainnet-stats-manager/src/components/promoted-stats/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/promoted-stats/promoted-stats.tsx create mode 100644 libs/mainnet-stats-manager/src/components/stats-manager/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/stats-manager/stats-manager.tsx create mode 100644 libs/mainnet-stats-manager/src/components/table-row/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/table-row/table-row.tsx create mode 100644 libs/mainnet-stats-manager/src/components/table/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/table/table.tsx create mode 100644 libs/mainnet-stats-manager/src/components/tooltip/index.ts create mode 100644 libs/mainnet-stats-manager/src/components/tooltip/tooltip.tsx create mode 100644 libs/mainnet-stats-manager/src/config/stats-fields.ts create mode 100644 libs/mainnet-stats-manager/src/config/types.ts create mode 100644 libs/mainnet-stats-manager/src/index.ts create mode 100644 libs/mainnet-stats-manager/tsconfig.json create mode 100644 libs/mainnet-stats-manager/tsconfig.lib.json create mode 100644 libs/mainnet-stats-manager/tsconfig.spec.json create mode 100644 libs/ui-toolkit/src/components/vega-logo/index.ts create mode 100644 libs/ui-toolkit/src/components/vega-logo/lozenge.stories.tsx create mode 100644 libs/ui-toolkit/src/components/vega-logo/vega-logo.spec.tsx create mode 100644 libs/ui-toolkit/src/components/vega-logo/vega-logo.tsx diff --git a/apps/explorer-e2e/src/support/pages/base-page.js b/apps/explorer-e2e/src/support/pages/base-page.js index 75fa90c98..344b6e125 100644 --- a/apps/explorer-e2e/src/support/pages/base-page.js +++ b/apps/explorer-e2e/src/support/pages/base-page.js @@ -54,7 +54,7 @@ export default class BasePage { validateSearchDisplayed() { cy.getByTestId(this.blockExplorerHeader).should( 'have.text', - 'Vega Block Explorer' + 'Vega Explorer' ); cy.getByTestId(this.searchField).should('be.visible'); } diff --git a/apps/explorer/src/app/routes/home/index.tsx b/apps/explorer/src/app/routes/home/index.tsx index f1633ff56..032d9254b 100644 --- a/apps/explorer/src/app/routes/home/index.tsx +++ b/apps/explorer/src/app/routes/home/index.tsx @@ -1,7 +1,9 @@ +import { StatsManager } from '@vegaprotocol/mainnet-stats-manager'; + const Home = () => { return (
-

Home page content

+
); }; diff --git a/apps/stats-mainnet-e2e/.eslintrc.json b/apps/stats-mainnet-e2e/.eslintrc.json new file mode 100644 index 000000000..696cb8b12 --- /dev/null +++ b/apps/stats-mainnet-e2e/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/stats-mainnet-e2e/cypress.json b/apps/stats-mainnet-e2e/cypress.json new file mode 100644 index 000000000..51e27859e --- /dev/null +++ b/apps/stats-mainnet-e2e/cypress.json @@ -0,0 +1,14 @@ +{ + "baseUrl": "http://localhost:3010", + "projectId": "et4snf", + "fileServerFolder": ".", + "fixturesFolder": "./src/fixtures", + "integrationFolder": "./src/integration", + "modifyObstructiveCode": false, + "supportFile": "./src/support/index.ts", + "pluginsFile": false, + "video": true, + "videosFolder": "../../dist/cypress/apps/stats-mainnet-e2e/videos", + "screenshotsFolder": "../../dist/cypress/apps/stats-mainnet-e2e/screenshots", + "chromeWebSecurity": false +} diff --git a/apps/stats-mainnet-e2e/project.json b/apps/stats-mainnet-e2e/project.json new file mode 100644 index 000000000..bdf7accfc --- /dev/null +++ b/apps/stats-mainnet-e2e/project.json @@ -0,0 +1,28 @@ +{ + "root": "apps/stats-mainnet-e2e", + "sourceRoot": "apps/stats-mainnet-e2e/src", + "projectType": "application", + "targets": { + "e2e": { + "executor": "@nrwl/cypress:cypress", + "options": { + "cypressConfig": "apps/stats-mainnet-e2e/cypress.json", + "devServerTarget": "stats-mainnet:serve" + }, + "configurations": { + "production": { + "devServerTarget": "stats-mainnet:serve:production" + } + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/stats-mainnet-e2e/**/*.{js,ts}"] + } + } + }, + "tags": [], + "implicitDependencies": ["stats-mainnet"] +} diff --git a/apps/stats-mainnet-e2e/src/fixtures/example.json b/apps/stats-mainnet-e2e/src/fixtures/example.json new file mode 100644 index 000000000..294cbed6c --- /dev/null +++ b/apps/stats-mainnet-e2e/src/fixtures/example.json @@ -0,0 +1,4 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io" +} diff --git a/apps/stats-mainnet-e2e/src/integration/app.spec.ts b/apps/stats-mainnet-e2e/src/integration/app.spec.ts new file mode 100644 index 000000000..77a688f7c --- /dev/null +++ b/apps/stats-mainnet-e2e/src/integration/app.spec.ts @@ -0,0 +1,7 @@ +describe('stats-mainnet', () => { + beforeEach(() => cy.visit('/')); + + it('should display header', () => { + cy.get('h3').should('have.text', '/ Mainnet'); + }); +}); diff --git a/apps/stats-mainnet-e2e/src/support/commands.ts b/apps/stats-mainnet-e2e/src/support/commands.ts new file mode 100644 index 000000000..310f1fa0e --- /dev/null +++ b/apps/stats-mainnet-e2e/src/support/commands.ts @@ -0,0 +1,33 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Cypress { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface Chainable { + login(email: string, password: string): void; + } +} +// +// -- This is a parent command -- +Cypress.Commands.add('login', (email, password) => { + console.log('Custom command example: Login', email, password); +}); +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/apps/stats-mainnet-e2e/src/support/index.ts b/apps/stats-mainnet-e2e/src/support/index.ts new file mode 100644 index 000000000..3d469a6b6 --- /dev/null +++ b/apps/stats-mainnet-e2e/src/support/index.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; diff --git a/apps/stats-mainnet-e2e/tsconfig.json b/apps/stats-mainnet-e2e/tsconfig.json new file mode 100644 index 000000000..c4f818ecd --- /dev/null +++ b/apps/stats-mainnet-e2e/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "sourceMap": false, + "outDir": "../../dist/out-tsc", + "allowJs": true, + "types": ["cypress", "node"] + }, + "include": ["src/**/*.ts", "src/**/*.js"] +} diff --git a/apps/stats-mainnet/.babelrc b/apps/stats-mainnet/.babelrc new file mode 100644 index 000000000..61641ec8a --- /dev/null +++ b/apps/stats-mainnet/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "@nrwl/react/babel", + { + "runtime": "automatic" + } + ] + ], + "plugins": [] +} diff --git a/apps/stats-mainnet/.browserslistrc b/apps/stats-mainnet/.browserslistrc new file mode 100644 index 000000000..f1d12df4f --- /dev/null +++ b/apps/stats-mainnet/.browserslistrc @@ -0,0 +1,16 @@ +# This file is used by: +# 1. autoprefixer to adjust CSS to support the below specified browsers +# 2. babel preset-env to adjust included polyfills +# +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# If you need to support different browsers in production, you may tweak the list below. + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major version +last 2 iOS major versions +Firefox ESR +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/apps/stats-mainnet/.eslintrc.json b/apps/stats-mainnet/.eslintrc.json new file mode 100644 index 000000000..734ddacee --- /dev/null +++ b/apps/stats-mainnet/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/stats-mainnet/jest.config.js b/apps/stats-mainnet/jest.config.js new file mode 100644 index 000000000..d4328090a --- /dev/null +++ b/apps/stats-mainnet/jest.config.js @@ -0,0 +1,10 @@ +module.exports = { + displayName: 'stats-mainnet', + preset: '../../jest.preset.js', + transform: { + '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', + '^.+\\.[tj]sx?$': 'babel-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + coverageDirectory: '../../coverage/apps/stats-mainnet', +}; diff --git a/apps/stats-mainnet/postcss.config.js b/apps/stats-mainnet/postcss.config.js new file mode 100644 index 000000000..cbdd9c22c --- /dev/null +++ b/apps/stats-mainnet/postcss.config.js @@ -0,0 +1,10 @@ +const { join } = require('path'); + +module.exports = { + plugins: { + tailwindcss: { + config: join(__dirname, 'tailwind.config.js'), + }, + autoprefixer: {}, + }, +}; diff --git a/apps/stats-mainnet/project.json b/apps/stats-mainnet/project.json new file mode 100644 index 000000000..e66aa17c6 --- /dev/null +++ b/apps/stats-mainnet/project.json @@ -0,0 +1,74 @@ +{ + "root": "apps/stats-mainnet", + "sourceRoot": "apps/stats-mainnet/src", + "projectType": "application", + "targets": { + "build": { + "executor": "@nrwl/web:webpack", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "options": { + "compiler": "babel", + "outputPath": "dist/apps/stats-mainnet", + "index": "apps/stats-mainnet/src/index.html", + "baseHref": "/", + "main": "apps/stats-mainnet/src/main.tsx", + "polyfills": "apps/stats-mainnet/src/polyfills.ts", + "tsConfig": "apps/stats-mainnet/tsconfig.app.json", + "assets": [ + "apps/stats-mainnet/src/assets/favicon.ico", + "apps/stats-mainnet/src/assets" + ], + "styles": ["apps/stats-mainnet/src/styles/styles.css"], + "scripts": [], + "webpackConfig": "@nrwl/react/plugins/webpack" + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "apps/stats-mainnet/src/environments/environment.ts", + "with": "apps/stats-mainnet/src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + }, + "serve": { + "executor": "@nrwl/web:dev-server", + "options": { + "port": 3010, + "buildTarget": "stats-mainnet:build", + "hmr": true + }, + "configurations": { + "production": { + "buildTarget": "stats-mainnet:build:production", + "hmr": false + } + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/stats-mainnet/**/*.{ts,tsx,js,jsx}"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["coverage/apps/stats-mainnet"], + "options": { + "jestConfig": "apps/stats-mainnet/jest.config.js", + "passWithNoTests": true + } + } + }, + "tags": [] +} diff --git a/apps/stats-mainnet/src/app.tsx b/apps/stats-mainnet/src/app.tsx new file mode 100644 index 000000000..42aa79564 --- /dev/null +++ b/apps/stats-mainnet/src/app.tsx @@ -0,0 +1,24 @@ +import React, { useState } from 'react'; +import { Header } from './components/header'; +import { StatsManager } from '@vegaprotocol/mainnet-stats-manager'; + +function App() { + const [darkMode, setDarkMode] = useState( + document.documentElement.classList.contains('dark-mode-preferred') + ); + + return ( +
+
+
+ +
+
+ ); +} + +export default App; diff --git a/apps/stats-mainnet/src/assets/apple-touch-icon.png b/apps/stats-mainnet/src/assets/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..50cdf778219be9f8d123803a6a78e94f06ede5ef GIT binary patch literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^TR@ltNH9n&i+l&9SkfJR9T^xl_H+M9WCik>lDyqr z82-2SpV<%Ov6p!Iy0SlG;uK_-JAVA75d#DBHcuDFkcwMx=bXUpdfMD#CAjrCV2Y%Ytp9v#y!hm(OeO zO1W2-t!ACO{L61ky_2)g@0+V)JiE3Z>^7jy3=9wU7aSDtUY{7twA16W$D;UqnX?k- zoW2?%>lr=w;QhEF39X%msnOj!SIyfe&f8;_w$yvY$GXH1G1eZ%KmXmGb?W?Te`nA5 zDx;N4rq9!T*S#gc#waWG){IG)(;vwPZcX#{Zk1Kr>bVXO`lfu(X;XLU zyW|J$%4btTzP7q-)cb7M=xJ`ZJtuRsQC*({#u*WS|auPzMX0hzFV<-;;r^e zU#{#ZRXX&tEPVg^sIC5fD=r5$-pEzZUG>qr2#~+Jfx(%4ai9dH%mD)H(UhAzQ8KCvQzDn6vZ1veoHV?e01W z2&KK7Z?NZdO>)p(j)?CfH#p6H-wJUzsdUab9R)e?_{p4-ruzPpVy0T(%WIYc3w#D`%B#Z`m0@X z&Ya0vnK&!jR?Fewe*LK2QU|H4n>%eAAK!~wW`FmgZ-1;?y3naDzL)=>7d!S@-qmTz zKHH2J-%5VUoCZ47*~$c*at=(K^6meGu8uEv)6=(Z{n+&1=eGIP)O60L;_qj^TUWO= zi7P+n*SRglP&w_ z0QHE&^rWN~Cl_TFlw{`TF}P$F7vv;Xic3%30aPLZQ<9sQSDKcXTvA$;S_D%wQ|jeS zpc+BAn*5a19GK*fIdc?%lHpY$5hX#1kx@VP+3`tW5HT#X8khL>kZ83 z$R6MFJ$zjed6b&P1U8>^BIM+n*d~j&(e<@-{i$^Q*%Pd8PV@VfYJ)~o)}BRR6_px| zCZ2Q_E98Fvoa!+%MLEBD78QD%tk!8Xw%AIH-pD$Ak;n6E@)-P#dh!77)G^~$0~yy< zjT!$YJ~TOe6J4JpHNq$xZ+(Yl;X;ecxx}d|AB6_S!xu;F5pg!MvS`Le*?4#fc@z(? z^x#h!4__?cqbU;d1N_&&2loAEM_*}7M=@`1Iv0xFA52_&dYdu^7IprZk&%&+OLv?R zt0hAY{fIC0gbe)D8K6AXO0EF8qC8bhoMGb~7L=DNl}cQ{em#bpx?C>CO)p%yz<6m< zQ4wChevP|#@5145AT>1=w{G2HT(zyOjd9h2f&#`-DId+x&u5%;>(;G|j~+R41W%tn zWn45lITl@8XX-SQEp1PDCMD>Hf_R<8#fpqUAAl) z*DtYaTv)7+qamAax7;em~=u9*>9d%gviNGk!UoR-qL#AY|b0W?)`0 znBbUTavsN3*(Qj`O%S)qrsz`LZsSZ}ongEsJl;UMCO*D0q%T&D7mt*2Tm=yTGdT5- z?8igdBGa48F_U}yWyn>S%J8nJ8FE>NAF zYSvW$rP}f7)2ErneCN&`oI7_8IXO8@FQ#X>R4T>NrAt|@Vzb%Uxld~qS_9GZ-EOzz z?Af!}w{IV-Kd9bJb#JPjo6Tlc_fTz}>dZTK>;SDbXq`j#XPRS`)S%~=?0rSJ6WH|R>_bv zjX*6CPq9Q;eqfoQE(eA%! Fe*s9s&QkyY literal 0 HcmV?d00001 diff --git a/apps/stats-mainnet/src/assets/logo.png b/apps/stats-mainnet/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0245ca6ca81c05ecfe8aced61d2285f9fb099639 GIT binary patch literal 547 zcmV+;0^I$HP)KmQSvtKoG{O!Dd*vfu&nPBA|Ey4&c@k2(d}rco|k= zID{7wHxd?}L;fVBC!sRLH}jN7o|#GByl+`u>0f=--IWITnj(aVzeEW6WZK^qX$nyk z#rJ*2nD6_FqO|e8Y41o71OTvYyQ(VAc~w=mZMX5hX%7LWY36y(IWLOBvaCk{%d(21 z;GE}qZklF4Kv|Ypn)MWb4$89p1_<9R`hRax-n_@#?S?OzQra;sdI4s$89FG6!Z3_i zIv`D%qtR%;-^X!$I2?Ano#%Pm?G{N7eY5}^GG$q!_xp)Y-U zGr;}nO{dc*-bGOa09lq>0As8hFdmOjr&F4yNs=s=OT#c0i-oGHn4_wy<2dvAd@`9} zKBe?{JZ4#TyB$;!n l`#+N)2>46vo@if6KLM-Rp`fg+D69Yg002ovPDHLkV1lX(_mKbq literal 0 HcmV?d00001 diff --git a/apps/stats-mainnet/src/assets/logo192.png b/apps/stats-mainnet/src/assets/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..a229d08bab862389a65336a5227724f0e70577a2 GIT binary patch literal 1517 zcmeAS@N?(olHy`uVBq!ia0vp^2SAtuNHCOdH@*#|SkfJR9T^xl_H+M9WCik>lDyqr z82-2SpV<%Ov6p!Iy0SlG;uK_--*DjO5}jp^bRf21z({#{<|FU3C`@7}-Db17N4XhGAXW339z#kGqbG0Q)8nR}$< zdf`K-S0SYvCS~~_`JX@CZ|SPK(5rV#cLlq$0BweXI(G}_s*}-GQDwQojS*#?J5{;1 zn61+dsoe7`%_8%!`IlRZWZd5W_T=hhy1Urgx~|iS|9`bn;@|Gt_NqE{j{Q4JR%Zn) zDE{%n>VL;wDnjc@RzCG4UT!b^Tv%~9oy1t*6dE#GBE%kr>uB(>3T0Z{> ztN6SvOX5%LI~*dii<8^$wEkN586BamGljgr6wP+47iygKNiFPz!>R*k7#Xt_5_nnG zG&YzDY+z%$=5RoYBZ8R|4NWSr!>Wj(*CXu<#Zm;k1{9R)fPVg2v*u9r2fJuvn4!HWBJpQfyvJjZsg zQmM9|FYAhs#jadZTdi{6n}{vk`5t|{^F?p@YB!2bW<;=Yp~($pnB?A_a5njOlo z$Nv2E^6GBKmFw2XyRK9(T-uzSmbLxs=7~ltrWN(mH!f9fED&Jc zwIRvp$QqU`rnPC?S9D#8|DxtEv_7)n=0lm?*PiYa{vWXL>>cLxd@aVtcphkk`^qsM z-YZtTM}C3_&rz#{C;6IxQzX;GBUuhj-+M^smu@RZ=l^#a$KPl)H}tgKQxICT@J#6+ z7oW8kFU+sw3cdP;>oOO|>EG7ci{eg)W`A41YUSqJe?GCTOnLY3)fF~Lzx{dnaqh3@ z*7tqc^763pb`_3Szg2xb+Z0VIM7MZNH_QF9Sjs)$-iDif?_U8WrAasT8#fhrEA@X( zd!i+>dIn#^%pEh?C+`rBMoye7T(j&`mahDNhV{MIPQ~_PEKMBy7B)!6!Hv8|NItaOSe<*7Nz4-{}yw@vMd9` zkF`Izd}q2<Y?Yi}P+63jo>9W!3}Y!c78K;9DtP84 z>**+fY<{w3{~VwmahRTz)Z*l#%z~24{5%Gi%;JKa#7c4LsXKs5Bw$K%6Z1;b5|c|x zi&BeVYGz8kya`kz2v?Jzl9~gP{4r;a0#Gu%DkP#LD6w3jpeR2r6X=SP%7Rn{pk2uf z3>9-8f8yaN4Aam!<$wB&=hGktW@T=@WNu+)VeiQz%)$yT4JL { + return ( +
+ + +
+
+ + + +
+
+
+ ); +}; diff --git a/apps/stats-mainnet/src/components/header/index.ts b/apps/stats-mainnet/src/components/header/index.ts new file mode 100644 index 000000000..ddd972315 --- /dev/null +++ b/apps/stats-mainnet/src/components/header/index.ts @@ -0,0 +1 @@ +export { Header } from './header'; diff --git a/apps/stats-mainnet/src/components/images/dark-mode-toggle.tsx b/apps/stats-mainnet/src/components/images/dark-mode-toggle.tsx new file mode 100644 index 000000000..42a7ac3b2 --- /dev/null +++ b/apps/stats-mainnet/src/components/images/dark-mode-toggle.tsx @@ -0,0 +1,18 @@ +export const DarkModeToggle = () => { + return ( + + + + + + + ); +}; diff --git a/apps/stats-mainnet/src/components/images/index.ts b/apps/stats-mainnet/src/components/images/index.ts new file mode 100644 index 000000000..fd1bfea32 --- /dev/null +++ b/apps/stats-mainnet/src/components/images/index.ts @@ -0,0 +1,2 @@ +export { DarkModeToggle } from './dark-mode-toggle'; +export { LightModeToggle } from './light-mode-toggle'; diff --git a/apps/stats-mainnet/src/components/images/light-mode-toggle.tsx b/apps/stats-mainnet/src/components/images/light-mode-toggle.tsx new file mode 100644 index 000000000..f71b5eb9d --- /dev/null +++ b/apps/stats-mainnet/src/components/images/light-mode-toggle.tsx @@ -0,0 +1,10 @@ +export const LightModeToggle = () => { + return ( + + + + ); +}; diff --git a/apps/stats-mainnet/src/components/videos/index.ts b/apps/stats-mainnet/src/components/videos/index.ts new file mode 100644 index 000000000..d43c5dd49 --- /dev/null +++ b/apps/stats-mainnet/src/components/videos/index.ts @@ -0,0 +1 @@ +export { VegaBackgroundVideo } from './vega-background-video'; diff --git a/apps/stats-mainnet/src/components/videos/vega-background-video.tsx b/apps/stats-mainnet/src/components/videos/vega-background-video.tsx new file mode 100644 index 000000000..9b36df0be --- /dev/null +++ b/apps/stats-mainnet/src/components/videos/vega-background-video.tsx @@ -0,0 +1,16 @@ +export const VegaBackgroundVideo = () => { + return ( + + ); +}; diff --git a/apps/stats-mainnet/src/config/types.ts b/apps/stats-mainnet/src/config/types.ts new file mode 100644 index 000000000..ebab4ed91 --- /dev/null +++ b/apps/stats-mainnet/src/config/types.ts @@ -0,0 +1,4 @@ +export interface DarkModeState { + darkMode: boolean; + setDarkMode: (arg0: boolean) => void; +} diff --git a/apps/stats-mainnet/src/index.html b/apps/stats-mainnet/src/index.html new file mode 100644 index 000000000..4476c74cc --- /dev/null +++ b/apps/stats-mainnet/src/index.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + Vega Mainnet Stats + + + + +
+ + + diff --git a/apps/stats-mainnet/src/main.tsx b/apps/stats-mainnet/src/main.tsx new file mode 100644 index 000000000..9ad023d26 --- /dev/null +++ b/apps/stats-mainnet/src/main.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './styles/styles.css'; +import App from './app'; +import reportWebVitals from './reportWebVitals'; + +ReactDOM.render( + + + , + 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/apps/stats-mainnet/src/polyfills.ts b/apps/stats-mainnet/src/polyfills.ts new file mode 100644 index 000000000..2adf3d05b --- /dev/null +++ b/apps/stats-mainnet/src/polyfills.ts @@ -0,0 +1,7 @@ +/** + * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`. + * + * See: https://github.com/zloirock/core-js#babel + */ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; diff --git a/apps/stats-mainnet/src/react-app-env.d.ts b/apps/stats-mainnet/src/react-app-env.d.ts new file mode 100644 index 000000000..6431bc5fc --- /dev/null +++ b/apps/stats-mainnet/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/stats-mainnet/src/reportWebVitals.ts b/apps/stats-mainnet/src/reportWebVitals.ts new file mode 100644 index 000000000..49a2a16e0 --- /dev/null +++ b/apps/stats-mainnet/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/apps/stats-mainnet/src/setupTests.ts b/apps/stats-mainnet/src/setupTests.ts new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/apps/stats-mainnet/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/apps/stats-mainnet/src/styles/AlphaLyrae-Medium.woff b/apps/stats-mainnet/src/styles/AlphaLyrae-Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..38b19bca54fb16e9eb8cc121ae9869658e377af3 GIT binary patch literal 131420 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

|_nJAE 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

diff --git a/libs/web3/.babelrc b/libs/web3/.babelrc new file mode 100644 index 000000000..ccae900be --- /dev/null +++ b/libs/web3/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nrwl/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/libs/web3/.eslintrc.json b/libs/web3/.eslintrc.json new file mode 100644 index 000000000..734ddacee --- /dev/null +++ b/libs/web3/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libs/web3/README.md b/libs/web3/README.md new file mode 100644 index 000000000..4ddd1785f --- /dev/null +++ b/libs/web3/README.md @@ -0,0 +1,7 @@ +# web3 + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test web3` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/web3/jest.config.js b/libs/web3/jest.config.js new file mode 100644 index 000000000..bd0f5f9e5 --- /dev/null +++ b/libs/web3/jest.config.js @@ -0,0 +1,10 @@ +module.exports = { + displayName: 'web3', + preset: '../../jest.preset.js', + transform: { + '^.+\\.[tj]sx?$': 'babel-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + coverageDirectory: '../../coverage/libs/web3', + setupFilesAfterEnv: ['./src/setup-tests.ts'], +}; diff --git a/libs/web3/project.json b/libs/web3/project.json new file mode 100644 index 000000000..76a6d2287 --- /dev/null +++ b/libs/web3/project.json @@ -0,0 +1,23 @@ +{ + "root": "libs/web3", + "sourceRoot": "libs/web3/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["libs/web3/**/*.{ts,tsx,js,jsx}"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["coverage/libs/web3"], + "options": { + "jestConfig": "libs/web3/jest.config.js", + "passWithNoTests": true + } + } + } +} diff --git a/libs/web3/src/index.ts b/libs/web3/src/index.ts new file mode 100644 index 000000000..76dfd08fb --- /dev/null +++ b/libs/web3/src/index.ts @@ -0,0 +1,2 @@ +export * from './lib/web3-provider'; +export * from './lib/web3-connect-dialog'; diff --git a/libs/web3/src/lib/types.ts b/libs/web3/src/lib/types.ts new file mode 100644 index 000000000..f0a54f765 --- /dev/null +++ b/libs/web3/src/lib/types.ts @@ -0,0 +1,8 @@ +import { Web3ReactHooks } from '@web3-react/core'; +import { MetaMask } from '@web3-react/metamask'; +import { WalletConnect } from '@web3-react/walletconnect'; + +export type Connectors = { + [name: string]: [Connector, Web3ReactHooks, object]; +}; +type Connector = MetaMask | WalletConnect; diff --git a/libs/web3/src/lib/web3-connect-dialog.spec.tsx b/libs/web3/src/lib/web3-connect-dialog.spec.tsx new file mode 100644 index 000000000..9f73e7406 --- /dev/null +++ b/libs/web3/src/lib/web3-connect-dialog.spec.tsx @@ -0,0 +1,48 @@ +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { Web3ConnectDialog } from './web3-connect-dialog'; +import { initializeConnector } from '@web3-react/core'; +import { MetaMask } from '@web3-react/metamask'; + +const connectors = { + foo: initializeConnector((actions) => new MetaMask(actions)), + bar: initializeConnector((actions) => new MetaMask(actions)), +}; + +const props = { + dialogOpen: false, + setDialogOpen: jest.fn(), + connectors, + desiredChainId: 3, +}; + +test('Dialog can be open or closed', () => { + const { container, rerender } = render(); + expect(container).toBeEmptyDOMElement(); + rerender(); + expect(screen.getByTestId('web3-connector-list')).toBeInTheDocument(); + expect( + screen.getByText('Connect to your Ethereum wallet') + ).toBeInTheDocument(); +}); + +test('Renders connection options', async () => { + const spyOnConnect = jest + .spyOn(connectors.foo[0], 'activate') + .mockReturnValue(Promise.resolve()); + + render(); + const connectorList = screen.getByTestId('web3-connector-list'); + expect(connectorList).toBeInTheDocument(); + expect(connectorList.children).toHaveLength(Object.keys(connectors).length); + + // foo/bar connector options displayed + expect(screen.getByTestId('web3-connector-foo')).toBeInTheDocument(); + expect(screen.getByTestId('web3-connector-bar')).toBeInTheDocument(); + + // Assert connection is attempted with desired chain + fireEvent.click(screen.getByTestId('web3-connector-foo')); + expect(spyOnConnect).toHaveBeenCalledWith(props.desiredChainId); + await waitFor(() => { + expect(props.setDialogOpen).toHaveBeenCalledWith(false); + }); +}); diff --git a/libs/web3/src/lib/web3-connect-dialog.tsx b/libs/web3/src/lib/web3-connect-dialog.tsx new file mode 100644 index 000000000..de11df2d1 --- /dev/null +++ b/libs/web3/src/lib/web3-connect-dialog.tsx @@ -0,0 +1,44 @@ +import { Dialog, Intent } from '@vegaprotocol/ui-toolkit'; +import { Connectors } from './types'; + +interface Web3ConnectDialogProps { + dialogOpen: boolean; + setDialogOpen: (isOpen: boolean) => void; + connectors: Connectors; + desiredChainId?: number; +} + +export const Web3ConnectDialog = ({ + dialogOpen, + setDialogOpen, + connectors, + desiredChainId, +}: Web3ConnectDialogProps) => { + return ( + +
    + {Object.entries(connectors).map(([connectorName, [connector]]) => { + return ( +
  • + +
  • + ); + })} +
+
+ ); +}; diff --git a/libs/web3/src/lib/web3-provider.spec.tsx b/libs/web3/src/lib/web3-provider.spec.tsx new file mode 100644 index 000000000..29ca7da2e --- /dev/null +++ b/libs/web3/src/lib/web3-provider.spec.tsx @@ -0,0 +1,20 @@ +import { act, render, screen } from '@testing-library/react'; +import { initializeConnector } from '@web3-react/core'; +import { MetaMask } from '@web3-react/metamask'; +import { Web3Provider } from './web3-provider'; + +const connectors = { + foo: initializeConnector((actions) => new MetaMask(actions)), +}; + +test('Renders children', async () => { + await act(async () => { + render( + +
Child
+
+ ); + }); + + expect(screen.getByText('Child')).toBeInTheDocument(); +}); diff --git a/libs/web3/src/lib/web3-provider.tsx b/libs/web3/src/lib/web3-provider.tsx new file mode 100644 index 000000000..e7c429f93 --- /dev/null +++ b/libs/web3/src/lib/web3-provider.tsx @@ -0,0 +1,19 @@ +import { Web3ReactProvider } from '@web3-react/core'; +import { Connectors } from './types'; + +interface Web3ProviderProps { + children: JSX.Element | JSX.Element[]; + connectors: Connectors; +} + +export const Web3Provider = ({ children, connectors }: Web3ProviderProps) => { + return ( + { + return [connector, hooks]; + })} + > + {children} + + ); +}; diff --git a/libs/web3/src/setup-tests.ts b/libs/web3/src/setup-tests.ts new file mode 100644 index 000000000..7b0828bfa --- /dev/null +++ b/libs/web3/src/setup-tests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/libs/web3/tsconfig.json b/libs/web3/tsconfig.json new file mode 100644 index 000000000..4c089585e --- /dev/null +++ b/libs/web3/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/web3/tsconfig.lib.json b/libs/web3/tsconfig.lib.json new file mode 100644 index 000000000..252904bb7 --- /dev/null +++ b/libs/web3/tsconfig.lib.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/libs/web3/tsconfig.spec.json b/libs/web3/tsconfig.spec.json new file mode 100644 index 000000000..67f149c4c --- /dev/null +++ b/libs/web3/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/package.json b/package.json index 8f0744025..1b268ddf0 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,10 @@ "@types/lodash": "^4.14.180", "@types/uuid": "^8.3.4", "@vegaprotocol/vegawallet-service-api-client": "^0.4.6", + "@walletconnect/ethereum-provider": "^1.7.5", + "@web3-react/core": "8.0.20-beta.0", + "@web3-react/metamask": "8.0.16-beta.0", + "@web3-react/walletconnect": "^8.0.23-beta.0", "ag-grid-community": "^27.0.1", "ag-grid-react": "^27.0.1", "apollo": "^2.33.9", diff --git a/tsconfig.base.json b/tsconfig.base.json index f7792cf38..55dd28414 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -27,7 +27,8 @@ "libs/tailwindcss-config/src/index.js" ], "@vegaprotocol/ui-toolkit": ["libs/ui-toolkit/src/index.ts"], - "@vegaprotocol/wallet": ["libs/wallet/src/index.ts"] + "@vegaprotocol/wallet": ["libs/wallet/src/index.ts"], + "@vegaprotocol/web3": ["libs/web3/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index 880fcc030..9ae846565 100644 --- a/workspace.json +++ b/workspace.json @@ -15,6 +15,7 @@ "trading": "apps/trading", "trading-e2e": "apps/trading-e2e", "ui-toolkit": "libs/ui-toolkit", - "wallet": "libs/wallet" + "wallet": "libs/wallet", + "web3": "libs/web3" } } diff --git a/yarn.lock b/yarn.lock index 7d5c3fae4..1821b6c12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1718,6 +1718,31 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.1.tgz#9a05f00ecbac59565bf6907c8d2af8ac33303b48" + integrity sha512-w8Wx15nH+aVDvnoKCyI1f3x0B5idmk/bDJXMEUqCfdO8Eadd0QpDx9lDMTMmenhOmf9vufLJXjpSm24D3ZnVpg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" @@ -2162,6 +2187,31 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@json-rpc-tools/provider@^1.5.5": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6" + integrity sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA== + dependencies: + "@json-rpc-tools/utils" "^1.7.6" + axios "^0.21.0" + safe-json-utils "^1.1.1" + ws "^7.4.0" + +"@json-rpc-tools/types@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" + integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@json-rpc-tools/utils@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/utils/-/utils-1.7.6.tgz#67f04987dbaa2e7adb6adff1575367b75a9a9ba1" + integrity sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw== + dependencies: + "@json-rpc-tools/types" "^1.7.6" + "@pedrouid/environment" "^1.0.1" + "@mdx-js/loader@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4" @@ -2206,6 +2256,11 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== +"@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== + "@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" @@ -3172,6 +3227,11 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@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== + "@phenomnomnominal/tsquery@4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df" @@ -5648,6 +5708,240 @@ url-parse "^1.4.3" whatwg-fetch "^3.0.0" +"@walletconnect/browser-utils@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.7.5.tgz#a12ff382310bfbb02509a69565dacf14aa744461" + integrity sha512-gm9ufi0n5cGBXoGWDtMVSqIJ0eXYW+ZFuTNVN0fm4oal26J7cPrOdFjzhv5zvx5fKztWQ21DNFZ+PRXBjXg04Q== + dependencies: + "@walletconnect/safe-json" "1.0.0" + "@walletconnect/types" "^1.7.5" + "@walletconnect/window-getters" "1.0.0" + "@walletconnect/window-metadata" "1.0.0" + detect-browser "5.2.0" + +"@walletconnect/client@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.7.5.tgz#7c3a1fc5a9f41022892c3c2b85be94afec49268e" + integrity sha512-Vh3h1kfhmJ4Jx//H0lmmfDc5Q2s+R73Nh5cetVN41QPRrAcqHE4lR2ZS8XxRCNBl4/gcHZJIZS9J2Ui4tTXBLA== + dependencies: + "@walletconnect/core" "^1.7.5" + "@walletconnect/iso-crypto" "^1.7.5" + "@walletconnect/types" "^1.7.5" + "@walletconnect/utils" "^1.7.5" + +"@walletconnect/core@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.7.5.tgz#623d19d4578b6195bb0f6e6313316d32fa4b2f10" + integrity sha512-c4B8s9fZ/Ah2p460Hxo4e9pwLQVYT2+dVYAfqaxVzfYjhAokDEtO55Bdm1hujtRjQVqwTvCljKxBB+LgMp3k8w== + dependencies: + "@walletconnect/socket-transport" "^1.7.5" + "@walletconnect/types" "^1.7.5" + "@walletconnect/utils" "^1.7.5" + +"@walletconnect/crypto@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" + integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + "@walletconnect/randombytes" "^1.0.2" + aes-js "^3.1.2" + hash.js "^1.1.7" + +"@walletconnect/encoding@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" + integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== + dependencies: + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + +"@walletconnect/environment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" + integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== + +"@walletconnect/ethereum-provider@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.7.5.tgz#2cc6e8759b9a4cf1ea400e3c5d779faf7846b92a" + integrity sha512-hEY7YhQSCcUccwuVgQvpL/FZB6ov07ad+FZ0NSsr8Xv54ysmgoaE8tdReVa8zrGK2LCuB6mtfSGx2E0bZ2H4Ng== + dependencies: + "@walletconnect/client" "^1.7.5" + "@walletconnect/jsonrpc-http-connection" "^1.0.0" + "@walletconnect/jsonrpc-provider" "^1.0.2" + "@walletconnect/signer-connection" "^1.7.5" + "@walletconnect/types" "^1.7.5" + "@walletconnect/utils" "^1.7.5" + eip1193-provider "1.0.1" + eventemitter3 "4.0.7" + +"@walletconnect/iso-crypto@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.7.5.tgz#12d624605c656c8eed31a9d073d85b73cd0be291" + integrity sha512-mJdRs2SqAPOLBBqLhU+ZnAh2c8TL2uDuL/ojV4aBzZ0ZHNT7X2zSOjAiixCb3vvH8GAt30OKmiRo3+ChI/9zvA== + dependencies: + "@walletconnect/crypto" "^1.0.2" + "@walletconnect/types" "^1.7.5" + "@walletconnect/utils" "^1.7.5" + +"@walletconnect/jsonrpc-http-connection@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.0.tgz#5bbdfbaf6d6519b3c08e492a6badb7460ab5ecd0" + integrity sha512-fmBTox7Zo9Tb8wzKpnOgYl5cYPu+2xXifNMDYMRGkWDAygXBzRzmfdhk7OowCkSXeh8aDhE5eFtMk+u8MOmntg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/safe-json" "^1.0.0" + cross-fetch "^3.1.4" + +"@walletconnect/jsonrpc-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.2.tgz#283d7fc064ce81bf6d57678e1cf299cbd0b5505c" + integrity sha512-7sIjzg27I7noPRULYTV2QEWWNV3+d3f5T7ym8VTtCRoA1Xf+SoN9cZJotO0GCCk0jVcvN2BX3DCSq6WbcCi4Eg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/safe-json" "^1.0.0" + +"@walletconnect/jsonrpc-types@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz#fa75ad5e8f106a2e33287b1e6833e22ed0225055" + integrity sha512-11QXNq5H1PKZk7bP8SxgmCw3HRaDuPOVE+wObqEvmhc7OWYUZqfuaaMb+OXGRSOHL3sbC+XHfdeCxFTMXSFyng== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz#1a2f668d606e8f0b6e7d8fdebae86001bd037a3f" + integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== + dependencies: + "@walletconnect/environment" "^1.0.0" + "@walletconnect/jsonrpc-types" "^1.0.0" + +"@walletconnect/mobile-registry@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== + +"@walletconnect/qrcode-modal@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.7.5.tgz#d7b42b4109c20d00c28e5a617992db6e8d79471e" + integrity sha512-LVq35jc3VMGq1EMcGCObQtEiercMDmUHDnc7A3AmUo0LoAbaPo6c8Hq0zqy2+JhtLmxUhU3ktf+szmCoiUDTUQ== + dependencies: + "@walletconnect/browser-utils" "^1.7.5" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.7.5" + copy-to-clipboard "^3.3.1" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/randombytes@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" + integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + randombytes "^2.1.0" + +"@walletconnect/safe-json@1.0.0", "@walletconnect/safe-json@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== + +"@walletconnect/signer-connection@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/signer-connection/-/signer-connection-1.7.5.tgz#ad37b34534445c7c3870f6fb33d2188f52054bd9" + integrity sha512-O7WO1Yqu8eBDfUJYeEkQDV2LDvj5JvAltTRn7El0IYOjK/T979c4NvyBpjHv9rp0eKX6/60foynj4D/h9hA4ew== + dependencies: + "@walletconnect/client" "^1.7.5" + "@walletconnect/jsonrpc-types" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/qrcode-modal" "^1.7.5" + "@walletconnect/types" "^1.7.5" + eventemitter3 "4.0.7" + +"@walletconnect/socket-transport@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.7.5.tgz#5416886403c7bea526f4ced6452fd1056c0a1354" + integrity sha512-4TYCxrNWb4f5a1NGsALXidr+/6dOiqgVfUQJ4fdP6R7ijL+7jtdiktguU9FIDq5wFXRE+ZdpCpwSAfOt60q/mQ== + dependencies: + "@walletconnect/types" "^1.7.5" + "@walletconnect/utils" "^1.7.5" + ws "7.5.3" + +"@walletconnect/types@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.7.5.tgz#145d7dd9df4415178995df6d4facef41c371ab6f" + integrity sha512-0HvZzxD93et4DdrYgAvclI1BqclkZS7iPWRtbGg3r+PQhRPbOkNypzBy6XH6wflbmr+WBGdmyJvynHsdhcCqUA== + +"@walletconnect/utils@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.7.5.tgz#762bf7f384846772416e44b636ce9792d1d7db5f" + integrity sha512-U954rIIA/g/Cmdqy+n3hMY1DDMmXxGs8w/QmrK9b/H5nkQ3e4QicOyynq5g/JTTesN5HZdDTFiyX9r0GSKa+iA== + dependencies: + "@walletconnect/browser-utils" "^1.7.5" + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/types" "^1.7.5" + bn.js "4.11.8" + js-sha3 "0.8.0" + query-string "6.13.5" + +"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== + +"@walletconnect/window-metadata@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== + dependencies: + "@walletconnect/window-getters" "^1.0.0" + +"@web3-react/core@8.0.20-beta.0": + version "8.0.20-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-8.0.20-beta.0.tgz#a98e751955029c2deca22acd5fe300f527bae142" + integrity sha512-VMsCaoCC4c/cCOhCnQkHBo7VRMnLFokh8Gx+ju+WQz3b0c3V/qywcEUNrJoNhDryc863oNYjQti7cb5hhlJPVQ== + dependencies: + "@web3-react/store" "^8.0.14-beta.0" + "@web3-react/types" "^8.0.10-beta.0" + zustand "^4.0.0-beta.2" + optionalDependencies: + "@ethersproject/providers" "^5.6.0" + +"@web3-react/metamask@8.0.16-beta.0": + version "8.0.16-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/metamask/-/metamask-8.0.16-beta.0.tgz#66ec1131a0d09774ebdb9e9a98aba8c70e39ae74" + integrity sha512-YuI2UY7ka+VJt8m7K3SmpXouyORZIIcNyAERc50ipZPeWro9j/a0qDavFZ0OnE8nhGrgBA+kJq+hMTvZrggCZQ== + dependencies: + "@metamask/detect-provider" "^1.2.0" + "@web3-react/types" "^8.0.10-beta.0" + +"@web3-react/store@^8.0.14-beta.0": + version "8.0.14-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/store/-/store-8.0.14-beta.0.tgz#302a5275f50323d63cd3a9f075414e5b63164f55" + integrity sha512-Z6ja+ilt7NWeL4wMcDLzD15255i0hcDySzvMwggqkEYs+hY3+w/R3dlR3FZDApr+MsxDq3wDukaQVUdKYA+Oqw== + dependencies: + "@ethersproject/address" "^5.6.0" + "@web3-react/types" "^8.0.10-beta.0" + zustand "^4.0.0-beta.2" + +"@web3-react/types@^8.0.10-beta.0": + version "8.0.10-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-8.0.10-beta.0.tgz#8ed9f1b5e40dcbe2a08be5ce9dd9e3ef2b2a6908" + integrity sha512-HitBmoKHyLDeRrJgtkImPddb8nzsb/FroAdiaYA15gAwAE3Y/p7Nd/TN8IANlgKcMkuyGyUjPD27fE7Mvw9rEA== + dependencies: + zustand "^4.0.0-beta.2" + +"@web3-react/walletconnect@^8.0.23-beta.0": + version "8.0.23-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect/-/walletconnect-8.0.23-beta.0.tgz#ce6debb7383508d95ae828627d8a7f9286dbe8ed" + integrity sha512-MUq11Pmp9Y4Y+Cey5HrWNJM0gA76u02CzgsL4/iF1ph6t0cuqZj0C6guwwkTMF9apxUTlMpWgpywRQDbxdqDoA== + dependencies: + "@web3-react/types" "^8.0.10-beta.0" + eventemitter3 "^4.0.7" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -6044,6 +6338,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + ag-grid-community@^27.0.1: version "27.0.1" resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-27.0.1.tgz#7ce5c000d321ba2c22447837e793b1d8366f4cdb" @@ -6836,7 +7135,7 @@ axe-core@^4.2.0, axe-core@^4.3.5: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== -axios@^0.21.1: +axios@^0.21.0, axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -7206,6 +7505,11 @@ bluebird@^3.3.5, bluebird@^3.4.1, bluebird@^3.5.5, bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@4.11.8: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -7533,12 +7837,30 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@^1.0.0: +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== @@ -7578,7 +7900,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.6.0: +buffer@^5.4.3, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -8261,6 +8583,15 @@ cli-ux@^5.2.1: supports-hyperlinks "^2.1.0" tslib "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -8768,6 +9099,13 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -9413,6 +9751,11 @@ detab@2.0.4: dependencies: repeat-string "^1.5.4" +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-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -9474,6 +9817,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -9689,6 +10037,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +eip1193-provider@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3" + integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g== + dependencies: + "@json-rpc-tools/provider" "^1.5.5" + ejs@^3.1.5: version "3.1.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" @@ -9731,6 +10086,11 @@ emittery@^0.8.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -10412,7 +10772,7 @@ eventemitter2@^6.4.3: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== -eventemitter3@^4.0.0, eventemitter3@^4.0.4: +eventemitter3@4.0.7, eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -11670,7 +12030,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, 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== @@ -12729,7 +13089,7 @@ is-typed-array@^1.1.3, is-typed-array@^1.1.7: foreach "^2.0.5" has-tostringtag "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -12783,7 +13143,7 @@ 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.5: +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -13614,6 +13974,11 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -14783,7 +15148,7 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.6.1: +node-fetch@2.6.7, node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -15667,6 +16032,11 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -16063,6 +16433,11 @@ postcss@^8.2.13, postcss@^8.2.15, postcss@^8.3.5, postcss@^8.4.6, postcss@^8.4.7 picocolors "^1.0.0" source-map-js "^1.0.2" +preact@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -16278,6 +16653,19 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qrcode@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== + dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + qs@6.9.7: version "6.9.7" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" @@ -16295,6 +16683,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +query-string@6.13.5: + version "6.13.5" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + query-string@^6.13.8: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -17236,6 +17633,11 @@ safe-identifier@^0.4.2: resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== +safe-json-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" + integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -18166,6 +18568,15 @@ string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -18237,7 +18648,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.2.0: +strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -19108,7 +19519,7 @@ typed-assert@^1.0.8: resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== -typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -19452,6 +19863,11 @@ use-subscription@1.5.1: dependencies: object-assign "^4.1.1" +use-sync-external-store@1.0.0-rc.1-next-629036a9c-20220224: + version "1.0.0-rc.1-next-629036a9c-20220224" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0-rc.1-next-629036a9c-20220224.tgz#40cf472454789403c2de6c8471d177459d184dc1" + integrity sha512-IhuMl0apVVYsT3XPfV+0nuwf0T6+3d4YxQXV4tDRsGpSQcYVG4zoWwfX4zdtouUfuelYg4t2SEmFifIMrxPfIw== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -20145,6 +20561,15 @@ wrap-ansi@^4.0.0: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -20183,7 +20608,12 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: +ws@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^7.4.0, ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== @@ -20243,6 +20673,14 @@ yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.7: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -20268,6 +20706,22 @@ yargs@15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^13.2.4: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -20324,6 +20778,13 @@ zen-observable@0.8.15, zen-observable@^0.8.0: resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== +zustand@^4.0.0-beta.2: + version "4.0.0-beta.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.0.0-beta.2.tgz#27fdc32b62225cc18976c0cf8866ecee9a9f4a98" + integrity sha512-aJ5ypnOwPIa/uSjdZv/oHChTWPplpFOG/hvWwzkR5ahFiPI5R6ifyObf8Fz1Vi6Obz2wY1N32fT2pNrpT2hzPw== + dependencies: + use-sync-external-store "1.0.0-rc.1-next-629036a9c-20220224" + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"