diff --git a/CHANGELOG.md b/CHANGELOG.md index 309f3f9c..1ea9be46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ Changelog ========= +## 1.5.0 + +### Compatible with: + +- [`cardano-graphql`: `4.0.0`](https://github.com/input-output-hk/cardano-graphql/releases/tag/4.0.0) + +### Features +- add query to support fetching transaction metadata ([d5f4344](https://github.com/input-output-hk/cardano-explorer-app/commit/d5f4344959be2f0bdd4e59426e915c5d85283c0c) +- asset metadata in tooltip ([e44a98d](https://github.com/input-output-hk/cardano-explorer-app/commit/e44a98dd0a229601abd527fef77cb85f96d3964d) +- add global slot number support ([65c4a32](https://github.com/input-output-hk/cardano-explorer-app/commit/65c4a3279b0517f4d0e07f3d5b6188239130a0bb) +- add support link to footer ([957b3ad](https://github.com/input-output-hk/cardano-explorer-app/commit/957b3ad1378de2f3206b391e55cf4f923278452d) +- allow rewards query ([30b0c68](https://github.com/input-output-hk/cardano-explorer-app/commit/30b0c68d249c05ec1d50e2fd972056cb2641e0b4) + +### Fixes +- remove stray acute character ([c67279a](https://github.com/input-output-hk/cardano-explorer-app/commit/c67279a3108595c6633932d670e442fef1a22ed6) +- infinite loading after block search ([b782199](https://github.com/input-output-hk/cardano-explorer-app/commit/b782199da40707a39932f3d4f5dc55e2b4da000d) +- use protocolVersion.major comparison to determine epoch slot count ([4c676d7](https://github.com/input-output-hk/cardano-explorer-app/commit/4c676d744eb2ca534b82635df7703d69722d966d) + +### Refactorings +- replace use fingerprint from API ([2b5ca7c](https://github.com/input-output-hk/cardano-explorer-app/commit/2b5ca7c66a85bbac8a8fdead277bcd33d28ba13e) + ## 1.4.0 ### Compatible with: diff --git a/README.md b/README.md index d0935260..45dffa10 100755 --- a/README.md +++ b/README.md @@ -19,9 +19,16 @@ See [environment](source/environment.ts) for defaults. ## Build This project uses an offline package cache to enable reproducible builds. + +### yarn ```console yarn --offline && yarn static:build ``` + +### nix +``` console +nix-build -A cardano-explorer-app +``` ## Deploy The static bundle can be deployed using a standard web server. A simple [Node.js program](deploy/index.js) is available for deploying the build to an AWS S3 bucket. @@ -55,4 +62,3 @@ The `master` and `develop` branches are continuously deployed, with PRs creating [![Netlify Status](https://api.netlify.com/api/v1/badges/09492acb-61fd-4745-8b0e-60c8886f60d1/deploy-status)](https://cardano-explorer-mainnet.netlify.app) #### Testnet [![Netlify Status](https://api.netlify.com/api/v1/badges/16628b5d-b1f2-429b-a707-bbdec0564fe9/deploy-status)](https://cardano-explorer-testnet.netlify.app) - diff --git a/package.json b/package.json index 007056c6..fd4edee9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cardano-explorer-app", - "version": "1.4.0", + "version": "1.5.0", "description": "Cardano Explorer App", "author": "Daedalus Team @ Input Output HK", "license": "Apache-2.0", @@ -33,7 +33,6 @@ } }, "dependencies": { - "@emurgo/cip14-js": "^2.0.0", "@types/react-addons-css-transition-group": "15.0.5", "bignumber.js": "9.0.1", "browser-update": "3.3.9", @@ -73,7 +72,7 @@ "@babel/plugin-transform-react-display-name": "7.8.3", "@babel/plugin-transform-react-jsx-self": "7.9.0", "@babel/plugin-transform-react-jsx-source": "7.9.0", - "@cardano-graphql/client-ts": "3.2.0", + "@cardano-graphql/client-ts": "^4.0.0", "@cypress/webpack-preprocessor": "4.1.1", "@graphql-codegen/cli": "1.2.0", "@graphql-codegen/typescript": "1.2.0", diff --git a/packages-cache/@cardano-graphql-client-ts-3.2.0.tgz b/packages-cache/@cardano-graphql-client-ts-3.2.0.tgz deleted file mode 100644 index a277f763..00000000 Binary files a/packages-cache/@cardano-graphql-client-ts-3.2.0.tgz and /dev/null differ diff --git a/packages-cache/@cardano-graphql-client-ts-4.0.0.tgz b/packages-cache/@cardano-graphql-client-ts-4.0.0.tgz new file mode 100644 index 00000000..e800d294 Binary files /dev/null and b/packages-cache/@cardano-graphql-client-ts-4.0.0.tgz differ diff --git a/packages-cache/@emurgo-cip14-js-2.0.0.tgz b/packages-cache/@emurgo-cip14-js-2.0.0.tgz deleted file mode 100644 index 57a40fd3..00000000 Binary files a/packages-cache/@emurgo-cip14-js-2.0.0.tgz and /dev/null differ diff --git a/packages-cache/bech32-2.0.0.tgz b/packages-cache/bech32-2.0.0.tgz deleted file mode 100644 index 3b6368c8..00000000 Binary files a/packages-cache/bech32-2.0.0.tgz and /dev/null differ diff --git a/packages-cache/blake2b-2.1.3.tgz b/packages-cache/blake2b-2.1.3.tgz deleted file mode 100644 index e1ba98e5..00000000 Binary files a/packages-cache/blake2b-2.1.3.tgz and /dev/null differ diff --git a/packages-cache/blake2b-wasm-1.1.7.tgz b/packages-cache/blake2b-wasm-1.1.7.tgz deleted file mode 100644 index f1b816b7..00000000 Binary files a/packages-cache/blake2b-wasm-1.1.7.tgz and /dev/null differ diff --git a/packages-cache/nanoassert-1.1.0.tgz b/packages-cache/nanoassert-1.1.0.tgz deleted file mode 100644 index d43f955c..00000000 Binary files a/packages-cache/nanoassert-1.1.0.tgz and /dev/null differ diff --git a/source/constants.ts b/source/constants.ts index 90266e4e..3cf433c5 100644 --- a/source/constants.ts +++ b/source/constants.ts @@ -10,7 +10,8 @@ export enum BrandType { export enum SearchType { EPOCH = 'epoch', - BLOCK = 'block', + BLOCK_BY_NUMBER = 'blockByNumber', + BLOCK_BY_SLOT_NUMBER = 'blockBySlotNumber', } export enum CardanoNetwork { diff --git a/source/environment.ts b/source/environment.ts index 748061df..ff4371ec 100755 --- a/source/environment.ts +++ b/source/environment.ts @@ -7,10 +7,10 @@ export const environment = { CARDANO: { ERA: (process.env.CARDANO_ERA as CardanoEra) || CardanoEra.BYRON, GRAPHQL: { - HTTP_URL: `${process.env.GRAPHQL_API_PROTOCOL || 'https'}://${ + HTTP_URL: `${process.env.GRAPHQL_API_PROTOCOL || 'http'}://${ process.env.GRAPHQL_API_HOST || - 'cardano-graphql-mainnet.daedalus-operations.com' - }:${process.env.GRAPHQL_API_PORT || '443'}/${ + 'localhost' + }:${process.env.GRAPHQL_API_PORT || '3100'}/${ process.env.GRAPHQL_API_PATH || '' }`, }, diff --git a/source/features/address/api/transformers.ts b/source/features/address/api/transformers.ts index 4c29165c..ed0d29a9 100644 --- a/source/features/address/api/transformers.ts +++ b/source/features/address/api/transformers.ts @@ -1,11 +1,12 @@ import { Currency } from 'cardano-js'; import { + Asset, SearchForPaymentAddressQuery, - SearchForStakeAddressQuery, Token, + SearchForStakeAddressQuery, } from '../../../../generated/typings/graphql-schema'; import { sortTokensDesc } from '../../../lib/arrays'; import { isDefined } from '../../../lib/types'; -import { assetFingerprintFromToken } from '../../transactions/helpers'; +import { assetTransformer } from '../../assets/api/transformers'; import { IPaymentAddressSummary, IStakeAddressSummary } from '../types'; export const paymentAddressDetailTransformer = ( @@ -20,12 +21,10 @@ export const paymentAddressDetailTransformer = ( tokensBalance: s .paymentAddresses![0]?.summary?.assetBalances?.filter(isDefined) - .filter(({ assetName }) => assetName !== 'ada') + .filter(({ asset }) => asset.assetName !== 'ada') .map((t) => ({ ...t, - asset: { - fingerprint: assetFingerprintFromToken(t as Token), - } + asset: assetTransformer(t.asset as Asset) })) .sort(sortTokensDesc) || [], transactionsCount: diff --git a/source/features/assets/api/transformers.ts b/source/features/assets/api/transformers.ts new file mode 100644 index 00000000..98cc8f4d --- /dev/null +++ b/source/features/assets/api/transformers.ts @@ -0,0 +1,15 @@ +import { Asset } from '../../../../generated/typings/graphql-schema'; +import { IAsset } from '../../transactions/types'; + +export const assetTransformer = ( + asset: Asset +): IAsset => { + return { + ...asset, + assetName: asset.assetName as string, + description: asset.description ? asset.description as string : undefined, + fingerprint: asset.fingerprint, + name: asset.name ? asset.name as string : undefined, + ticker: asset.ticker ? asset.ticker as string : undefined, + } +} diff --git a/source/features/blocks/api/BlockDetails.graphql b/source/features/blocks/api/BlockDetails.graphql index 850c33c2..6afe0c02 100644 --- a/source/features/blocks/api/BlockDetails.graphql +++ b/source/features/blocks/api/BlockDetails.graphql @@ -3,7 +3,7 @@ fragment BlockDetails on Block { ...BlockOverview - merkelRoot + merkleRoot nextBlock { hash number diff --git a/source/features/blocks/api/BlockOverview.graphql b/source/features/blocks/api/BlockOverview.graphql index 766f6b6a..840f1e3f 100644 --- a/source/features/blocks/api/BlockOverview.graphql +++ b/source/features/blocks/api/BlockOverview.graphql @@ -7,7 +7,7 @@ fragment BlockOverview on Block { hash number size - slotInEpoch + slotNo transactions_aggregate { aggregate { count diff --git a/source/features/blocks/api/transformers.ts b/source/features/blocks/api/transformers.ts index 4b140222..a1b5aad0 100644 --- a/source/features/blocks/api/transformers.ts +++ b/source/features/blocks/api/transformers.ts @@ -26,7 +26,7 @@ export const blockOverviewTransformer = ( output: Currency.Util.lovelacesToAda( b.transactions_aggregate?.aggregate?.sum?.totalOutput || '0' ), - slotWithinEpoch: formatSlotWithinEpoch(b.slotInEpoch), + slotNo: formatSlot(b.slotNo), transactionsCount: b.transactions_aggregate?.aggregate?.count.toString() || '0', }; @@ -36,7 +36,7 @@ export const blockDetailsTransformer = ( b: BlockDetailsFragment ): IBlockDetailed => ({ ...blockOverviewTransformer(b), - merkleRoot: b.merkelRoot || '', + merkleRoot: b.merkleRoot || '', nextBlock: { id: b.nextBlock?.hash || '', number: b.nextBlock?.number || '-', @@ -65,9 +65,9 @@ function formatCreatedBy(value: IBlockOverview['createdBy']): string { } } -function formatSlotWithinEpoch( - value: BlockOverviewFragment['slotInEpoch'] -): IBlockOverview['slotWithinEpoch'] { +function formatSlot( + value: BlockOverviewFragment['slotNo'] +): IBlockOverview['slotNo'] { switch (value) { case 0: return value; diff --git a/source/features/blocks/specs/getLatestBlocks.spec.ts b/source/features/blocks/specs/getLatestBlocks.spec.ts index bcbe0ec5..adc4d34d 100644 --- a/source/features/blocks/specs/getLatestBlocks.spec.ts +++ b/source/features/blocks/specs/getLatestBlocks.spec.ts @@ -35,7 +35,7 @@ describe('Blocks feature', () => { await waitForExpect(() => { expect(blocks.store.latestBlocks.length).toBe(10); expect(blocks.store.latestBlocks[0].number).toBeDefined(); - expect(blocks.store.latestBlocks[0].slotWithinEpoch).toBeDefined(); + expect(blocks.store.latestBlocks[0].slotNo).toBeDefined(); expect(blocks.store.latestBlocks[4].transactionsCount).toBeDefined(); expect(blocks.store.latestBlocks[1].number).toBeDefined(); }); diff --git a/source/features/blocks/types.ts b/source/features/blocks/types.ts index 81b4a5d3..0bde7b4e 100644 --- a/source/features/blocks/types.ts +++ b/source/features/blocks/types.ts @@ -8,7 +8,7 @@ export interface IBlockOverview { number: number | '-'; output: string; size: number; - slotWithinEpoch: number | '-'; + slotNo: number | '-'; transactionsCount: string; } diff --git a/source/features/blocks/ui/BlockList.module.scss b/source/features/blocks/ui/BlockList.module.scss index 2d0adaf3..3cec32c7 100644 --- a/source/features/blocks/ui/BlockList.module.scss +++ b/source/features/blocks/ui/BlockList.module.scss @@ -3,11 +3,15 @@ :global { .epoch { - width: 120px; + width: 40px; + } + + .slotNo { + width: 80px; } .blocksSlots { - width: 100px; + width: 80px; } .createdAt { diff --git a/source/features/blocks/ui/BlockList.tsx b/source/features/blocks/ui/BlockList.tsx index 1f296290..be272b76 100644 --- a/source/features/blocks/ui/BlockList.tsx +++ b/source/features/blocks/ui/BlockList.tsx @@ -27,21 +27,35 @@ const columns = ( return [ { cellRender: (row: IBlockOverview) => { - const content = `${row.epoch} / ${row.slotWithinEpoch}`; return isNumber(row.epoch) && - isNumber(row.slotWithinEpoch) && !linksDisabled ? ( - {content} + {row.epoch} ) : ( - {content} + {row.epoch} ); }, cellValue: (row: IBlockOverview) => row, cssClass: 'epoch', - head: 'block.epochSlotTitle', - key: 'epochsSlots', + head: 'block.epochTitle', + key: 'epoch', + }, + { + cellRender: (row: IBlockOverview) => { + return isNumber(row.slotNo) && + !linksDisabled ? ( + + {row.slotNo} + + ) : ( + {row.slotNo} + ); + }, + cellValue: (row: IBlockOverview) => row, + cssClass: 'slotNo', + head: 'block.slotNo', + key: 'slot', }, { cellRender: (row: IBlockOverview) => ( diff --git a/source/features/blocks/ui/BlockSummary.tsx b/source/features/blocks/ui/BlockSummary.tsx index a76505a1..7d1c3150 100644 --- a/source/features/blocks/ui/BlockSummary.tsx +++ b/source/features/blocks/ui/BlockSummary.tsx @@ -76,6 +76,12 @@ const BlockSummary = (props: BlockSummaryProps) => {
{props.number}
+
+
+ {translate('blockSummary.slot')} +
+
{props.slotNo}
+
{translate('blockSummary.confirmations')} diff --git a/source/features/epochs/api/transformers.ts b/source/features/epochs/api/transformers.ts index ad0f0776..8c9beedf 100644 --- a/source/features/epochs/api/transformers.ts +++ b/source/features/epochs/api/transformers.ts @@ -14,7 +14,7 @@ export const epochOverviewTransformer = ( percentage: e.number === n.currentEpoch ? n.currentEpochPercentageComplete : 100, slotsCount: - (!!e.blocks[0].protocolVersion + (e.blocks[0].protocolVersion.major > 1 ? n.shelleyEpochLength : n.byronSlotsPerEpoch) || 21600, startedAt: new Date(e.startedAt), diff --git a/source/features/epochs/specs/helpers/latestEpochsExample.ts b/source/features/epochs/specs/helpers/latestEpochsExample.ts index 89af3425..246c2c68 100644 --- a/source/features/epochs/specs/helpers/latestEpochsExample.ts +++ b/source/features/epochs/specs/helpers/latestEpochsExample.ts @@ -11,7 +11,7 @@ export const latestEpochsExample = [ number: 31070, output: '0', size: 666, - slotWithinEpoch: 9486, + slotNo: 9486, transactionsCount: '0', }, ] as IBlockOverview[], @@ -34,7 +34,7 @@ export const latestEpochsExample = [ number: 31070, output: '0', size: 666, - slotWithinEpoch: 9486, + slotNo: 9486, transactionsCount: '0', }, ] as IBlockOverview[], diff --git a/source/features/epochs/ui/EpochSummary.tsx b/source/features/epochs/ui/EpochSummary.tsx index a11c8006..cddc0e93 100644 --- a/source/features/epochs/ui/EpochSummary.tsx +++ b/source/features/epochs/ui/EpochSummary.tsx @@ -42,9 +42,13 @@ const EpochSummary = ({ title, epoch }: IEpochSummaryProps) => {
{translate('epochSummary.numberOfBlocks')}
-
- {epoch.blocksCount} / {epoch.slotsCount} +
{epoch.blocksCount}
+
+
+
+ {translate('epochSummary.numberOfSlots')}
+
{epoch.slotsCount}
diff --git a/source/features/i18n/translations/de.json b/source/features/i18n/translations/de.json index 4766b92a..76c5d9cb 100644 --- a/source/features/i18n/translations/de.json +++ b/source/features/i18n/translations/de.json @@ -15,10 +15,11 @@ "blockTitle": "Block", "createdAtTitle": "Erzeugt", "createdByTitle": "Erzeugt von", - "epochSlotTitle": "Epoche / Slot", + "epochTitle": "Epoche", "outputTitle": "Output (₳)", "pageTitle": "Block | $t(productTitle)", "sizeTitle": "Größe (Bytes)", + "slot": "Slot", "summary": "Block Übersicht", "transactionsTitle": "Transaktionen" }, @@ -32,6 +33,7 @@ "nextBlock": "Nächster Block", "previousBlock": "Voriger Block", "size": "Größe", + "slot": "Slot", "time": "Zeitpunkt", "transactions": "Transaktionen" }, @@ -62,6 +64,7 @@ "epochSummaryTitle": "Epoche Übersicht", "lastBlockAt": "Letzter Block", "numberOfBlocks": "Anzahl an Blöcken", + "numberOfSlots": "Anzahl an Slots", "startedAt": "Gestartet", "totalOutput": "Output insgesamt", "transactions": "Transaktionen" @@ -87,6 +90,7 @@ "ouroborosAlgorithm": "Ouroboros Algorythmus", "project": "Projekt.", "shellyExplorer": "Shelley Explorer", + "submitASupportRequest": "Senden Sie eine Supportanfrage", "textTitle": "Cardano ist ein", "whyCardano": "Warum Cardano" }, @@ -128,7 +132,8 @@ "notExist": "Adresse existiert nicht:", "notFound": "Es tut uns Leid, wir konnten keine Ergebnisse finden zu:", "placeholder": "Suche nach Epochen, Blöcken, Addressen und Transaktionen", - "suggestion_block": "Suche nach einem Block", + "suggestion_block_by_number": "Suchen Sie nach einem Block nach Nummer", + "suggestion_block_by_slot": "Suchen Sie nach einem Block nach Slot", "suggestion_epoch": "Suche nach einer Epoche", "title": "Suche" }, diff --git a/source/features/i18n/translations/en.json b/source/features/i18n/translations/en.json index 17c05520..fd3062bc 100644 --- a/source/features/i18n/translations/en.json +++ b/source/features/i18n/translations/en.json @@ -15,10 +15,11 @@ "blockTitle": "Block", "createdAtTitle": "Created At", "createdByTitle": "Created By", - "epochSlotTitle": "Epoch / Slot", + "epochTitle": "Epoch", "outputTitle": "Output (₳)", "pageTitle": "Block | $t(productTitle)", "sizeTitle": "Size (Bytes)", + "slotNo": "Slot", "summary": "Block Summary", "transactionsTitle": "Transactions" }, @@ -32,6 +33,7 @@ "nextBlock": "Next block", "previousBlock": "Previous block", "size": "Size", + "slot": "Slot", "time": "Time", "transactions": "Transactions" }, @@ -62,6 +64,7 @@ "epochSummaryTitle": "Epoch Summary", "lastBlockAt": "Last Block at", "numberOfBlocks": "# of blocks", + "numberOfSlots": "# of slots", "startedAt": "Started at", "totalOutput": "Total output", "transactions": "Transactions" @@ -87,6 +90,7 @@ "ouroborosAlgorithm": "Ouroboros Algorithm", "project": "project.", "shellyExplorer": "Shelley Explorer", + "submitASupportRequest": "Submit a Support Request", "textTitle": "Cardano is an", "whyCardano": "Why Cardano" }, @@ -128,7 +132,8 @@ "notExist": "Address does not exist:", "notFound": "Sorry, we could not find any results matching:", "placeholder": "Search for epochs, blocks, addresses and transactions", - "suggestion_block": "Search for a block", + "suggestion_block_by_number": "Search for a block by number", + "suggestion_block_by_slot": "Search for a block by slot", "suggestion_epoch": "Search for an epoch", "title": "Search" }, diff --git a/source/features/i18n/translations/ja.json b/source/features/i18n/translations/ja.json index cea9d161..0b527e24 100644 --- a/source/features/i18n/translations/ja.json +++ b/source/features/i18n/translations/ja.json @@ -15,10 +15,11 @@ "blockTitle": "ブロック", "createdAtTitle": "生成時", "createdByTitle": "生成者", - "epochSlotTitle": "エポック/スロット", + "epochTitle": "エポック", "outputTitle": "アウトプット (₳)", "pageTitle": "ブロック | $t(productTitle)", "sizeTitle": "サイズ(バイト)", + "slot": "スロット", "summary": "ブロック概要", "transactionsTitle": "トランザクション" }, @@ -32,6 +33,7 @@ "nextBlock": "次のブロック", "previousBlock": "前のブロック", "size": "サイズ", + "slot": "スロット", "time": "時間", "transactions": "トランザクション" }, @@ -62,6 +64,7 @@ "epochSummaryTitle": "エポック概要", "lastBlockAt": "最終ブロック", "numberOfBlocks": "ブロック数", + "numberOfSlots": "スロット数", "startedAt": "開始時間", "totalOutput": "総アウトプット", "transactions": "トランザクション" @@ -87,6 +90,7 @@ "ouroborosAlgorithm": "Ouroborosアルゴリズム", "project": "プロジェクトです", "shellyExplorer": "Shelleyエクスプローラー", + "submitASupportRequest": "サポートリクエストを送信する", "textTitle": "Cardanoは", "whyCardano": "なぜCardanoを構築するのか" }, @@ -128,7 +132,8 @@ "notExist": "アドレスが見つかりません", "notFound": "一致する検索結果はありません", "placeholder": "エポック、ブロック、アドレス、トランザクションを検索する", - "suggestion_block": "ブロックを検索", + "suggestion_block_by_number": "ブロックを番号で検索する", + "suggestion_block_by_slot": "ブロックをスロット番号で検索する", "suggestion_epoch": "エポックを検索", "title": "検索" }, diff --git a/source/features/network-info/api/cardanoDynamic.graphql b/source/features/network-info/api/cardanoDynamic.graphql index 15e4a114..92c62094 100644 --- a/source/features/network-info/api/cardanoDynamic.graphql +++ b/source/features/network-info/api/cardanoDynamic.graphql @@ -3,6 +3,7 @@ query cardanoDynamic { tip { number slotInEpoch + slotNo forgedAt protocolVersion } diff --git a/source/features/network-info/store.ts b/source/features/network-info/store.ts index 14603e57..c526e07f 100644 --- a/source/features/network-info/store.ts +++ b/source/features/network-info/store.ts @@ -16,6 +16,7 @@ export class NetworkInfoStore extends Store { @observable public byronSlotsPerEpoch?: number; @observable public shelleyEpochLength?: number; @observable public slotsPerPresentEpoch: number; + @observable public slotNo: number; private readonly networkInfoApi: NetworkInfoApi; private readonly networkInfoActions: NetworkInfoActions; @@ -81,6 +82,7 @@ export class NetworkInfoStore extends Store { this.currentEpoch = currentEpoch.number; this.lastSlotFilled = tip.slotInEpoch || 0; this.lastBlockTime = new Date(tip.forgedAt); + this.slotNo = tip.slotNo || 0; }); } }; diff --git a/source/features/rewards/api/README.md b/source/features/rewards/api/README.md new file mode 100644 index 00000000..55a491c7 --- /dev/null +++ b/source/features/rewards/api/README.md @@ -0,0 +1 @@ +Present to be included in the list of allowed queries. diff --git a/source/features/rewards/api/getRewardsForAddresses.graphql b/source/features/rewards/api/getRewardsForAddresses.graphql new file mode 100644 index 00000000..5f63d7b8 --- /dev/null +++ b/source/features/rewards/api/getRewardsForAddresses.graphql @@ -0,0 +1,22 @@ +query getRewardsForAddresses ( + $addresses: [StakeAddress!]! + $limit: Int + $offset: Int + $order_by: [Reward_order_by!] +) { + rewards( + limit: $limit + offset: $offset + order_by: $order_by + where: { address: { _in: $addresses }} + ) { + address + amount + earnedIn { + number + } + stakePool { + id + } + } +} diff --git a/source/features/search/api/index.ts b/source/features/search/api/index.ts index 7922f59f..64e173c1 100644 --- a/source/features/search/api/index.ts +++ b/source/features/search/api/index.ts @@ -5,6 +5,8 @@ import { SearchByIdQueryVariables, SearchForBlockByNumberQuery, SearchForBlockByNumberQueryVariables, + SearchForBlockBySlotNumberQuery, + SearchForBlockBySlotNumberQueryVariables, SearchForEpochByNumberQuery, SearchForEpochByNumberQueryVariables, SearchForPaymentAddressQuery, @@ -14,6 +16,7 @@ import { } from '../../../typings/graphql-schema'; import searchByIdQuery from './searchById.graphql'; import searchForBlockByNumberQuery from './searchForBlockByNumber.graphql'; +import searchForBlockBySlotNumberQuery from './searchForBlockBySlotNumber.graphql'; import searchForEpochByNumberQuery from './searchForEpochByNumber.graphql'; import searchForPaymentAddressQuery from './searchForPaymentAddress.graphql'; import searchForStakeAddressQuery from './searchForStakeAddress.graphql'; @@ -39,6 +42,11 @@ export class SearchApi { SearchForBlockByNumberQueryVariables >; + public searchForBlockBySlotNumberQuery: GraphQLRequest< + SearchForBlockBySlotNumberQuery, + SearchForBlockBySlotNumberQueryVariables + >; + public searchForEpochByNumberQuery: GraphQLRequest< SearchForEpochByNumberQuery, SearchForEpochByNumberQueryVariables @@ -58,6 +66,10 @@ export class SearchApi { client, searchForBlockByNumberQuery ); + this.searchForBlockBySlotNumberQuery = new GraphQLRequest( + client, + searchForBlockBySlotNumberQuery + ); this.searchForEpochByNumberQuery = new GraphQLRequest( client, searchForEpochByNumberQuery diff --git a/source/features/search/api/searchForBlockBySlotNumber.graphql b/source/features/search/api/searchForBlockBySlotNumber.graphql new file mode 100644 index 00000000..9291beca --- /dev/null +++ b/source/features/search/api/searchForBlockBySlotNumber.graphql @@ -0,0 +1,15 @@ +#import "../../blocks/api/BlockDetails.graphql" + +query searchForBlockBySlotNumber( + $slotNo: Int! +) { + blocks( + where: { + slotNo: { + _eq: $slotNo + } + } + ) { + ...BlockDetails + } +} diff --git a/source/features/search/api/searchForPaymentAddress.graphql b/source/features/search/api/searchForPaymentAddress.graphql index 7e913457..5ec8f402 100644 --- a/source/features/search/api/searchForPaymentAddress.graphql +++ b/source/features/search/api/searchForPaymentAddress.graphql @@ -25,8 +25,14 @@ query searchForPaymentAddress( paymentAddresses(addresses: [$address]) { summary { assetBalances { - assetName - policyId + asset { + assetName + description + fingerprint + name + policyId + ticker + } quantity } } diff --git a/source/features/search/index.ts b/source/features/search/index.ts index 623e8027..35a25ea2 100644 --- a/source/features/search/index.ts +++ b/source/features/search/index.ts @@ -19,7 +19,9 @@ export class SearchActions { public searchForPaymentAddress: Action<{ address: string }> = new Action(); public searchForStakeAddress: Action<{ address: string }> = new Action(); public searchForBlockByNumber: Action<{ number: number }> = new Action(); + public searchForBlockBySlotNumber: Action<{ slotNo: number }> = new Action(); public searchForEpochByNumber: Action<{ number: number }> = new Action(); + public slotNumberSearchRequested: Action<{ slotNo: number }> = new Action(); public subscribeToEpoch: Action<{ number: number }> = new Action(); public unknownSearchRequested: Action<{ query: string }> = new Action(); public unsubscribeFromEpoch: Action = new Action(); diff --git a/source/features/search/specs/helpers/exampleBlockData.ts b/source/features/search/specs/helpers/exampleBlockData.ts index 1fb71f43..85d506fc 100644 --- a/source/features/search/specs/helpers/exampleBlockData.ts +++ b/source/features/search/specs/helpers/exampleBlockData.ts @@ -8,6 +8,6 @@ export const exampleBlockData = { id: '687bc1d9ff5b7c8167b25cca5659e80a40583512ba925271bf3005600eb0a0ec', }, size: 666, - slotWithinEpoch: 9486, + slotNo: 31086, transactionCount: '0', }; diff --git a/source/features/search/store.ts b/source/features/search/store.ts index 66e5d299..618ea9ff 100644 --- a/source/features/search/store.ts +++ b/source/features/search/store.ts @@ -90,10 +90,18 @@ export class SearchStore extends Store { this.searchActions.searchForBlockByNumber, this.searchForBlockByNumber, ], + [ + this.searchActions.searchForBlockBySlotNumber, + this.searchForBlockBySlotNumber, + ], [ this.searchActions.searchForEpochByNumber, this.searchForEpochByNumber, ], + [ + this.searchActions.slotNumberSearchRequested, + this.onSearchBySlotNumberRequested, + ], [ this.searchActions.unknownSearchRequested, this.onUnknownSearchRequested, @@ -114,7 +122,6 @@ export class SearchStore extends Store { return ( this.searchApi.searchByIdQuery.isExecuting || this.searchApi.searchForBlockByNumberQuery.isExecuting || - this.searchApi.searchForBlockByNumberQuery.isExecuting || this.searchApi.searchForEpochByNumberQuery.isExecuting || this.searchApi.searchForPaymentAddressQuery.isExecuting || this.searchApi.searchForStakeAddressQuery.isExecuting @@ -186,6 +193,18 @@ export class SearchStore extends Store { } }; + @action private onSearchBySlotNumberRequested = async (params: { + slotNo: number; + }) => { + await this.searchForBlockBySlotNumber({ slotNo: params.slotNo }); + if (this.blockSearchResult?.id) { + this.navigation.actions.push.trigger({ + path: BLOCK_SEARCH_RESULT_PATH, + query: { id: this.blockSearchResult?.id }, + }); + } + }; + private onSearchByEpochNumberRequested = async (params: { number: number; }) => { @@ -309,6 +328,30 @@ export class SearchStore extends Store { } }; + @action private searchForBlockBySlotNumber = async (params: { + slotNo: number; + }) => { + // Do not trigger another search if we already have the requested data! + if ( + this.searchApi.searchForBlockByNumberQuery.isExecuting || + this.blockSearchResult?.slotNo === params.slotNo + ) { + return; + } + this.blockSearchResult = null; + const result = await this.searchApi.searchForBlockBySlotNumberQuery.execute( + params + ); + if (result) { + const blockData = result.blocks[0]; + if (isDefined(blockData)) { + runInAction(() => { + this.blockSearchResult = blockDetailsTransformer(blockData); + }); + } + } + }; + @action private searchForEpochByNumber = async (params: { number: number; }) => { diff --git a/source/features/search/ui/BlockSearchResult.tsx b/source/features/search/ui/BlockSearchResult.tsx index 2513d7ca..e26ec144 100644 --- a/source/features/search/ui/BlockSearchResult.tsx +++ b/source/features/search/ui/BlockSearchResult.tsx @@ -36,7 +36,8 @@ export const BlockSearchResult = () => { {() => { const { blockSearchResult } = store; if ( - !api.searchByIdQuery.hasBeenExecutedAtLeastOnce || + (!api.searchForBlockByNumberQuery.hasBeenExecutedAtLeastOnce && + !api.searchByIdQuery.hasBeenExecutedAtLeastOnce) || store.isSearching || !networkInfo.store.blockHeight ) { diff --git a/source/features/search/ui/Search.tsx b/source/features/search/ui/Search.tsx index 81825efd..dd6a4017 100644 --- a/source/features/search/ui/Search.tsx +++ b/source/features/search/ui/Search.tsx @@ -33,7 +33,9 @@ const Search = (props: ISearchProps) => { ? styles.enlargedSearchContainer : styles.shrinkedSearchContainer; const searchTypeStyle = - searchType === SearchType.EPOCH || searchType === SearchType.BLOCK + searchType === SearchType.EPOCH || + searchType === SearchType.BLOCK_BY_NUMBER || + searchType === SearchType.BLOCK_BY_SLOT_NUMBER ? styles.type : ''; diff --git a/source/features/search/ui/SearchBar.tsx b/source/features/search/ui/SearchBar.tsx index db867d6e..8718dd4c 100644 --- a/source/features/search/ui/SearchBar.tsx +++ b/source/features/search/ui/SearchBar.tsx @@ -31,7 +31,8 @@ export const SearchBar = (props: ISearchBarProps) => { const searchNumber = parseInt(query, 10); if ( searchNumber > networkInfo.currentEpoch && - searchNumber > networkInfo.blockHeight + searchNumber > networkInfo.blockHeight && + searchNumber > networkInfo.slotNo ) { search.actions.unknownSearchRequested.trigger({ query }); } else { @@ -39,10 +40,14 @@ export const SearchBar = (props: ISearchBarProps) => { search.actions.epochNumberSearchRequested.trigger({ number: searchNumber, }); - } else if (typeOfSearch === SearchType.BLOCK) { + } else if (typeOfSearch === SearchType.BLOCK_BY_NUMBER) { search.actions.blockNumberSearchRequested.trigger({ number: searchNumber, }); + } else if (typeOfSearch === SearchType.BLOCK_BY_SLOT_NUMBER) { + search.actions.slotNumberSearchRequested.trigger({ + slotNo: searchNumber, + }); } } } else { diff --git a/source/features/search/ui/SearchSuggestions.tsx b/source/features/search/ui/SearchSuggestions.tsx index 4fa050d4..0c85f644 100644 --- a/source/features/search/ui/SearchSuggestions.tsx +++ b/source/features/search/ui/SearchSuggestions.tsx @@ -22,9 +22,15 @@ const SearchSuggestions = (props: ISearchSuggestionsProps) => {
-
  • onSearchTypeSelect('block')}> +
  • onSearchTypeSelect('blockByNumber')}>
    - {translate('search.suggestion_block')} {value} + {translate('search.suggestion_block_by_number')} {value} +
    + +
  • +
  • onSearchTypeSelect('blockBySlotNumber')}> +
    + {translate('search.suggestion_block_by_slot')} {value}
  • diff --git a/source/features/transactions/api/README.md b/source/features/transactions/api/README.md new file mode 100644 index 00000000..2093e0f6 --- /dev/null +++ b/source/features/transactions/api/README.md @@ -0,0 +1 @@ +transactionMetadata is present to be included in the list of allowed queries. diff --git a/source/features/transactions/api/TransactionDetails.graphql b/source/features/transactions/api/TransactionDetails.graphql index 4bcb48d6..96f019cc 100644 --- a/source/features/transactions/api/TransactionDetails.graphql +++ b/source/features/transactions/api/TransactionDetails.graphql @@ -10,8 +10,14 @@ fragment TransactionDetails on Transaction { hash, includedAt, mint { - assetName - policyId + asset { + assetName + description + fingerprint + name + policyId + ticker + } quantity } inputs { @@ -20,8 +26,14 @@ fragment TransactionDetails on Transaction { sourceTxIndex value tokens { - assetName - policyId + asset { + assetName + description + fingerprint + name + policyId + ticker + } quantity } }, @@ -34,8 +46,14 @@ fragment TransactionDetails on Transaction { index value tokens { - assetName - policyId + asset { + assetName + description + fingerprint + name + policyId + ticker + } quantity } }, diff --git a/source/features/transactions/api/transactionMetadata.graphql b/source/features/transactions/api/transactionMetadata.graphql new file mode 100644 index 00000000..d8202bd8 --- /dev/null +++ b/source/features/transactions/api/transactionMetadata.graphql @@ -0,0 +1,18 @@ +query transactionMetadata( + $hashes: [Hash32Hex!]! +) { + transactions( + where: { + hash: { + _in: $hashes + } + } + ) { + hash + metadata { + key + value + } + } +} + diff --git a/source/features/transactions/api/transformers.ts b/source/features/transactions/api/transformers.ts index 50e1c293..5b916d63 100644 --- a/source/features/transactions/api/transformers.ts +++ b/source/features/transactions/api/transformers.ts @@ -1,8 +1,9 @@ +import BigNumber from 'bignumber.js'; import { Currency } from 'cardano-js'; -import { Token, TransactionDetailsFragment } from '../../../../generated/typings/graphql-schema'; +import { Asset, TransactionDetailsFragment } from '../../../../generated/typings/graphql-schema'; import { sortTokensDesc } from '../../../lib/arrays'; import { isDefined } from '../../../lib/types'; -import { assetFingerprintFromToken } from '../helpers'; +import { assetTransformer } from '../../assets/api/transformers'; import { ITransactionDetails } from '../types'; export const transactionDetailsTransformer = ( @@ -15,12 +16,10 @@ export const transactionDetailsTransformer = ( }, burn: tx.mint - ?.filter((m) => m.quantity < '0') + ?.filter((m) => new BigNumber(m.quantity).isLessThan(0)) .map((t) => ({ ...t, - asset: { - fingerprint: assetFingerprintFromToken(t as Token) - }, + asset: assetTransformer(t.asset as Asset), quantity: t.quantity.substring(1), })) .sort(sortTokensDesc) || [], @@ -34,9 +33,7 @@ export const transactionDetailsTransformer = ( tokens: i.tokens .map((t) => ({ ...t, - asset: { - fingerprint: assetFingerprintFromToken(t as Token) - } + asset: assetTransformer(t.asset as Asset) })) .sort(sortTokensDesc), value: Currency.Util.lovelacesToAda(i.value), @@ -47,12 +44,10 @@ export const transactionDetailsTransformer = ( })), mint: tx.mint - ?.filter((m) => m.quantity > '0') + ?.filter((m) => new BigNumber(m.quantity).isGreaterThan(0)) .map((t) => ({ ...t, - asset: { - fingerprint: assetFingerprintFromToken(t as Token) - } + asset: assetTransformer(t.asset as Asset) })) .sort(sortTokensDesc) || [], outputs: tx.outputs?.filter(isDefined).map((i) => ({ @@ -60,9 +55,7 @@ export const transactionDetailsTransformer = ( tokens: i.tokens .map((t) => ({ ...t, - asset: { - fingerprint: assetFingerprintFromToken(t as Token) - } + asset: assetTransformer(t.asset as Asset) })) .sort(sortTokensDesc), value: Currency.Util.lovelacesToAda(i.value), diff --git a/source/features/transactions/components/TransactionInfo.module.scss b/source/features/transactions/components/TransactionInfo.module.scss index 08fde82f..730d15c9 100644 --- a/source/features/transactions/components/TransactionInfo.module.scss +++ b/source/features/transactions/components/TransactionInfo.module.scss @@ -64,6 +64,9 @@ $wide-breakpoint: 768px; display: flex; justify-content: space-between; margin-top: 5px; + @media (max-width: $medium-breakpoint) { + flex-direction: column; + } .amount { display: none; diff --git a/source/features/transactions/components/TransactionTokenList.module.scss b/source/features/transactions/components/TransactionTokenList.module.scss index bdedc53c..60762751 100644 --- a/source/features/transactions/components/TransactionTokenList.module.scss +++ b/source/features/transactions/components/TransactionTokenList.module.scss @@ -19,14 +19,11 @@ $wide-breakpoint: 768px; .tokenList, .scrollableTokenList { - display: none; - @media (min-width: $medium-breakpoint) { - display: flex; - flex-direction: column; - align-items: flex-start; - word-break: break-all; - margin-bottom: 5px; - } + display: flex; + flex-direction: column; + align-items: flex-start; + word-break: break-all; + margin-bottom: 5px; .token { margin-top: 1px; @@ -38,7 +35,6 @@ $wide-breakpoint: 768px; .tooltip { word-break: break-all; font-size: 10px; - font-weight: 600; color: var(--solid-text-color); line-height: calc(10px + 10px); letter-spacing: 1.3px; diff --git a/source/features/transactions/components/TransactionTokenList.tsx b/source/features/transactions/components/TransactionTokenList.tsx index 42cbea60..3fa77a6a 100644 --- a/source/features/transactions/components/TransactionTokenList.tsx +++ b/source/features/transactions/components/TransactionTokenList.tsx @@ -8,12 +8,17 @@ import styles from './TransactionTokenList.module.scss'; const TokenList = (props: { tokens: IToken[]; }) => { const [tooltipPosition, setTooltipPosition] = useState({}); const containerRef = useRef(null); - const [fingerprint, setFingerprint] = useState('test'); + const [asset, setAsset] = useState({ + assetName: '', + description: '', + fingerprint: '', + policyId: '' + }); const [isVisible, setIsVisible] = useState(false); const handleMouseOver = ( event: React.MouseEvent, - value: IAsset['fingerprint'] + item: IAsset ) => { const { offsetLeft } = event.currentTarget; setTooltipPosition((prevState) => ({ @@ -21,7 +26,7 @@ const TokenList = (props: { tokens: IToken[]; }) => { left: offsetLeft + 120 * 0.75, top: containerRef.current?.offsetTop! + 75, })); - setFingerprint(value); + setAsset(item); setIsVisible(true); }; @@ -29,7 +34,17 @@ const TokenList = (props: { tokens: IToken[]; }) => { <> {isVisible && (
    - + +
  • Ticker: {asset.ticker}
  • +
  • Name: {asset.name}
  • +
  • Description: {asset.description}
  • +
  • Policy ID: {asset.policyId}
  • +
  • Asset Name: {asset.assetName}
  • + } + />
    )} @@ -37,31 +52,41 @@ const TokenList = (props: { tokens: IToken[]; }) => {
    {props.tokens.map((t) => ( handleMouseOver(event, t.asset.fingerprint)} + onMouseEnter={(event) => handleMouseOver(event, t.asset)} onMouseOut={() => { setIsVisible(false); }} className={styles.token} - >` - {`${t.quantity} ${addEllipsis(t.asset.fingerprint, 9, 4)}`}{' '} + > + {`${t.quantity} ${t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)}`}{' '} ))}
    ) : (
    {props.tokens.map((t) => ( - + +
      +
    • Ticker: {t.asset.ticker}
    • +
    • Name: {t.asset.name}
    • +
    • Description: {t.asset.description}
    • +
    • Policy ID: {t.asset.policyId}
    • +
    • Asset Name: {t.asset.assetName}
    • +
    + } /> } > - {`${t.quantity} ${addEllipsis(t.asset.fingerprint, 9, 4)}`} + {`${t.quantity} ${t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)}`}
    - ))} + ) + )}
    )} diff --git a/source/features/transactions/helpers.ts b/source/features/transactions/helpers.ts index e34d790a..f90f070c 100644 --- a/source/features/transactions/helpers.ts +++ b/source/features/transactions/helpers.ts @@ -1,5 +1,3 @@ -import AssetFingerprint from '@emurgo/cip14-js'; -import { Token } from '../../../generated/typings/graphql-schema'; import { BLOCK_SEARCH_RESULT_PATH } from '../blocks/config'; import { EPOCH_SEARCH_RESULT_PATH } from '../epochs/config'; import { TRANSACTION_SEARCH_RESULT_PATH } from './config'; @@ -13,8 +11,3 @@ export const getEpochRoute = (epoch: number) => export const getBlockRoute = (blockId: string) => `${BLOCK_SEARCH_RESULT_PATH}?id=${blockId}`; -export const assetFingerprintFromToken = (token: Token) => - new AssetFingerprint( - Buffer.from(token.policyId, 'hex'), - token.assetName ? Buffer.from(token.assetName.substr(2), 'hex') : undefined) - .fingerprint() diff --git a/source/features/transactions/types.ts b/source/features/transactions/types.ts index b0255dc7..100c5eec 100644 --- a/source/features/transactions/types.ts +++ b/source/features/transactions/types.ts @@ -1,5 +1,10 @@ export interface IAsset { + assetName: string; + description?: string; fingerprint: string; + name?: string; + policyId: string; + ticker?: string; } export interface IToken { diff --git a/source/widgets/layout/Footer.tsx b/source/widgets/layout/Footer.tsx index cfe5f3f3..ac03a0e1 100644 --- a/source/widgets/layout/Footer.tsx +++ b/source/widgets/layout/Footer.tsx @@ -104,6 +104,11 @@ export const Footer = (props: IFooterProps) => { {translate('footer.ouroborosAlgorithm')} +
  • + + {translate('footer.submitASupportRequest')} + +
  • diff --git a/source/widgets/tooltip/Tooltip.module.scss b/source/widgets/tooltip/Tooltip.module.scss index 1b76ce02..9f8876fd 100644 --- a/source/widgets/tooltip/Tooltip.module.scss +++ b/source/widgets/tooltip/Tooltip.module.scss @@ -12,7 +12,7 @@ position: relative; } .tooltip .translateCenter { - @include text(10px, 600, var(--solid-text-color), 1.3px); + @include text(11px, 300, var(--solid-text-color), 1.3px); visibility: hidden; text-align: left; padding: 5px 10px; @@ -24,9 +24,10 @@ transform: translate(0%, -100%); z-index: 9999000; opacity: 1 !important; - width: 200px; + width: 300px; top: -5px; left: 100px; + transition-delay: 0.2s; } .tooltip:hover .translateCenter { @@ -39,6 +40,5 @@ } .body { color: var(--info-text-color); - font-weight: 400; } } diff --git a/source/widgets/tooltip/Tooltip.tsx b/source/widgets/tooltip/Tooltip.tsx index a500c026..4e9cbd28 100644 --- a/source/widgets/tooltip/Tooltip.tsx +++ b/source/widgets/tooltip/Tooltip.tsx @@ -8,7 +8,7 @@ interface ITooltipProps { style?: object; } -export const ContentContainer = (props: { label: string; body?: string }) => ( +export const ContentContainer = (props: { label: string; body?: React.ReactNode }) => (
    {props.label}
    { props.body ??
    {props.body}
    } diff --git a/yarn.lock b/yarn.lock index 95f6eab9..b92791f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1443,10 +1443,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cardano-graphql/client-ts@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@cardano-graphql/client-ts/-/client-ts-3.2.0.tgz#4382455246b439d319e5958e2def3b124c9f41ec" - integrity sha512-A4ok149eV95J9/y1Q5OmLDtJqWjdIf0ASoLR87KHr1AyY6FfxVhXI0FDX3NlLkYtcAWa4SzJC8XoMfGmXJBumg== +"@cardano-graphql/client-ts@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cardano-graphql/client-ts/-/client-ts-4.0.0.tgz#db03b7c10a8a1436e8417ae5b95784adad3120d7" + integrity sha512-QnDqq/5QUE3OcalD3HGuuB8LSWrOSEDQnn0LZQNHgNWRrY6CaiCgKDKNDGYL7jpGCJJQm5A+/Njht0qHDiG6PA== "@cnakazawa/watch@^1.0.3": version "1.0.4" @@ -1614,14 +1614,6 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@emurgo/cip14-js@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@emurgo/cip14-js/-/cip14-js-2.0.0.tgz#6ef78ddac8a35f2725e9ccebfd5ae114716c4b48" - integrity sha512-EvjgTs4NCqH1j0wxXqWCj31P7NmTzl3aR+9am0OLSsf3NA9GsdKH5QNyXJrvSZILM4yWzlZNum3y8S5PfdM1aA== - dependencies: - bech32 "2.0.0" - blake2b "2.1.3" - "@graphql-codegen/cli@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.2.0.tgz#5a67c817559783c0d2e68199ab98f9003188f911" @@ -4250,11 +4242,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bech32@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - bech32@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" @@ -4307,21 +4294,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -blake2b-wasm@^1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz#e4d075da10068e5d4c3ec1fb9accc4d186c55d81" - integrity sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA== - dependencies: - nanoassert "^1.0.0" - -blake2b@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.3.tgz#f5388be424768e7c6327025dad0c3c6d83351bca" - integrity sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg== - dependencies: - blake2b-wasm "^1.1.0" - nanoassert "^1.0.0" - bluebird@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" @@ -10347,11 +10319,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nanoassert@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-1.1.0.tgz#4f3152e09540fde28c76f44b19bbcd1d5a42478d" - integrity sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40= - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"