From ccaffcd5db9fb67aa5efefa74ae0e421588f9214 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Mon, 21 Sep 2020 22:35:46 +1000 Subject: [PATCH 01/13] chore: update to cardano-graphql 2.2.0-beta use new combined schema in package, removing local build step --- .gitignore | 1 - codegen.yml | 2 +- package.json | 5 ++--- .../@cardano-graphql-client-ts-2.1.0.tgz | Bin 15137 -> 0 bytes .../@cardano-graphql-client-ts-2.2.0-beta.tgz | Bin 0 -> 17109 bytes source/utils/generateGraphQLSchema.js | 17 ----------------- yarn.lock | 8 ++++---- 7 files changed, 7 insertions(+), 26 deletions(-) delete mode 100644 packages-cache/@cardano-graphql-client-ts-2.1.0.tgz create mode 100644 packages-cache/@cardano-graphql-client-ts-2.2.0-beta.tgz delete mode 100644 source/utils/generateGraphQLSchema.js diff --git a/.gitignore b/.gitignore index b8e5e2b8..1725614d 100755 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,3 @@ yarn-error.log .env generated/ result* -schema.graphql diff --git a/codegen.yml b/codegen.yml index ee1c1d5a..cbb645d7 100644 --- a/codegen.yml +++ b/codegen.yml @@ -1,5 +1,5 @@ overwrite: true -schema: schema.graphql +schema: node_modules/@cardano-graphql/client-ts/api/schema.graphql documents: "source/**/*.graphql" generates: generated/typings/graphql-schema.d.ts: diff --git a/package.json b/package.json index 118edd15..b2fb8943 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,7 @@ "test": "jest", "test:e2e": "cypress run", "test:e2e:dev": "cypress open", - "generate:graphql-schema": "node source/utils/generateGraphQLSchema.js", - "generate:graphql-typings": "yarn generate:graphql-schema && graphql-codegen", + "generate:graphql-typings": "graphql-codegen", "export": "next export source --outdir build/static", "static:build": "NODE_ENV=production yarn build && yarn export", "static:serve": "serve ./build/static", @@ -72,7 +71,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": "2.1.0", + "@cardano-graphql/client-ts": "2.2.0-beta", "@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-2.1.0.tgz b/packages-cache/@cardano-graphql-client-ts-2.1.0.tgz deleted file mode 100644 index 6a83cb666ddb86423f396b3a4276a99ee501b66d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15137 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 PAMpAA$c9ec0KNeL{UfKD diff --git a/packages-cache/@cardano-graphql-client-ts-2.2.0-beta.tgz b/packages-cache/@cardano-graphql-client-ts-2.2.0-beta.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f1d5beaa4be78f4bc49feb97d98ffb7bd3959203 GIT binary patch literal 17109 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 Date: Sat, 19 Sep 2020 00:33:46 +1000 Subject: [PATCH 02/13] feat: show deposits and reclaims when present in transaction Shows Deposit or Deposit Reclaim in the TransactionInfo when present in transaction Closes #353 --- source/features/i18n/translations/de.json | 2 ++ source/features/i18n/translations/en.json | 2 ++ source/features/i18n/translations/ja.json | 2 ++ .../transactions/api/TransactionDetails.graphql | 1 + source/features/transactions/api/transformers.ts | 1 + .../transactions/components/TransactionInfo.tsx | 12 +++++++++++- source/features/transactions/types.ts | 1 + 7 files changed, 20 insertions(+), 1 deletion(-) diff --git a/source/features/i18n/translations/de.json b/source/features/i18n/translations/de.json index 25e1f420..3fdcbf68 100644 --- a/source/features/i18n/translations/de.json +++ b/source/features/i18n/translations/de.json @@ -152,6 +152,8 @@ "transaction": { "block": "Block", "confirmations": "Konfirmationen", + "deposit": "Kaution", + "depositReclaim": "Kautionsrückforderung", "epoch": "Epoche", "fee": "Transaktionsgebühr", "from": "Input-Adressen", diff --git a/source/features/i18n/translations/en.json b/source/features/i18n/translations/en.json index 97f8659b..87acb568 100644 --- a/source/features/i18n/translations/en.json +++ b/source/features/i18n/translations/en.json @@ -153,6 +153,8 @@ "transaction": { "block": "Block", "confirmations": "Confirmations", + "deposit": "Deposit", + "depositReclaim": "Deposit Reclaim", "epoch": "Epoch", "fee": "Transaction Fee", "from": "From addresses", diff --git a/source/features/i18n/translations/ja.json b/source/features/i18n/translations/ja.json index 904b8380..1f69212d 100644 --- a/source/features/i18n/translations/ja.json +++ b/source/features/i18n/translations/ja.json @@ -152,6 +152,8 @@ "transaction": { "block": "ブロック", "confirmations": "確認", + "deposit": "デポジット", + "depositReclaim": "デポジットの返還", "epoch": "エポック", "fee": "トランザクション手数料", "from": "送信元", diff --git a/source/features/transactions/api/TransactionDetails.graphql b/source/features/transactions/api/TransactionDetails.graphql index 2be03a9d..c34d6a88 100644 --- a/source/features/transactions/api/TransactionDetails.graphql +++ b/source/features/transactions/api/TransactionDetails.graphql @@ -5,6 +5,7 @@ fragment TransactionDetails on Transaction { number, slotNo, } + deposit, fee, hash, includedAt, diff --git a/source/features/transactions/api/transformers.ts b/source/features/transactions/api/transformers.ts index 68c7c07d..c949e89f 100644 --- a/source/features/transactions/api/transformers.ts +++ b/source/features/transactions/api/transformers.ts @@ -11,6 +11,7 @@ export const transactionDetailsTransformer = ( id: tx.block?.hash, number: tx.block?.number, }, + deposit: Currency.Util.lovelacesToAda(tx.deposit), fee: Currency.Util.lovelacesToAda(tx.fee), id: tx.hash, includedAt: new Date(tx.includedAt), diff --git a/source/features/transactions/components/TransactionInfo.tsx b/source/features/transactions/components/TransactionInfo.tsx index 7f5fe465..181d72d2 100644 --- a/source/features/transactions/components/TransactionInfo.tsx +++ b/source/features/transactions/components/TransactionInfo.tsx @@ -119,7 +119,7 @@ const TransactionInfo = (props: ITransactionInfoProps) => { }); }; const epoch = props.block.epoch === '-' ? 0 : props.block.epoch; - + const depositLabel = parseInt(props.deposit) >= 0 ? 'transaction.deposit' : 'transaction.depositReclaim' return (
{props.title && ( @@ -227,6 +227,16 @@ const TransactionInfo = (props: ITransactionInfoProps) => {
+ {/* ===== DEPOSIT ===== */} + {props.deposit !== '0' && ( +
+
+ {translate(depositLabel)} +
+
{Math.abs(parseInt(props.deposit))} ADA
+
+ )} + {/* ===== TOTAL OUTPUT ===== */}
diff --git a/source/features/transactions/types.ts b/source/features/transactions/types.ts index 63148484..cb44125c 100644 --- a/source/features/transactions/types.ts +++ b/source/features/transactions/types.ts @@ -20,6 +20,7 @@ export interface ITransactionDetails { number?: number | null; slot?: number | null; }; + deposit: string; fee: string; id: string; includedAt: Date; From 5cad6545147e9228550de7132cf4ff0a8f2dfe27 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Tue, 22 Sep 2020 12:08:22 +1000 Subject: [PATCH 03/13] feat: add withdrawals to TransactionInfo Withdrawals from reward accounts are displayed alongside transaction inputs in the 'from' section. Closes #352 --- source/features/i18n/translations/de.json | 3 ++- source/features/i18n/translations/en.json | 3 ++- source/features/i18n/translations/ja.json | 3 ++- source/features/transactions/api/TransactionDetails.graphql | 4 ++++ source/features/transactions/api/transformers.ts | 4 ++++ source/features/transactions/components/TransactionInfo.tsx | 5 +++-- source/features/transactions/types.ts | 5 +++++ 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/source/features/i18n/translations/de.json b/source/features/i18n/translations/de.json index 3fdcbf68..d72cb261 100644 --- a/source/features/i18n/translations/de.json +++ b/source/features/i18n/translations/de.json @@ -166,6 +166,7 @@ "summary": "Übersicht", "totalOutput": "Output Insgesamt", "transactionLabel": "Transaktion", - "transactionsLabel": "Transaktionen" + "transactionsLabel": "Transaktionen", + "withdrawals": "Abhebungen" } } diff --git a/source/features/i18n/translations/en.json b/source/features/i18n/translations/en.json index 87acb568..1258cfb8 100644 --- a/source/features/i18n/translations/en.json +++ b/source/features/i18n/translations/en.json @@ -167,6 +167,7 @@ "summary": "Summary", "totalOutput": "Total Output", "transactionLabel": "Transaction", - "transactionsLabel": "Transactions" + "transactionsLabel": "Transactions", + "withdrawals": "Withdrawals" } } diff --git a/source/features/i18n/translations/ja.json b/source/features/i18n/translations/ja.json index 1f69212d..4aeae513 100644 --- a/source/features/i18n/translations/ja.json +++ b/source/features/i18n/translations/ja.json @@ -166,6 +166,7 @@ "summary": "概要", "totalOutput": "総アウトプット", "transactionLabel": "トランザクション", - "transactionsLabel": "トランザクション" + "transactionsLabel": "トランザクション", + "withdrawals": "!!withdrawals" } } diff --git a/source/features/transactions/api/TransactionDetails.graphql b/source/features/transactions/api/TransactionDetails.graphql index c34d6a88..218fae75 100644 --- a/source/features/transactions/api/TransactionDetails.graphql +++ b/source/features/transactions/api/TransactionDetails.graphql @@ -21,4 +21,8 @@ fragment TransactionDetails on Transaction { value }, totalOutput + withdrawals { + address + amount + } } diff --git a/source/features/transactions/api/transformers.ts b/source/features/transactions/api/transformers.ts index c949e89f..5628976c 100644 --- a/source/features/transactions/api/transformers.ts +++ b/source/features/transactions/api/transformers.ts @@ -25,4 +25,8 @@ export const transactionDetailsTransformer = ( value: Currency.Util.lovelacesToAda(i.value), })), totalOutput: Currency.Util.lovelacesToAda(tx.totalOutput), + withdrawals: tx.withdrawals?.filter(isDefined).map((i) => ({ + address: i.address, + value: Currency.Util.lovelacesToAda(i.amount) + })) || [] }); diff --git a/source/features/transactions/components/TransactionInfo.tsx b/source/features/transactions/components/TransactionInfo.tsx index 181d72d2..55f2d898 100644 --- a/source/features/transactions/components/TransactionInfo.tsx +++ b/source/features/transactions/components/TransactionInfo.tsx @@ -18,6 +18,7 @@ import { ITransactionDetails, ITransactionInput, ITransactionOutput, + IWithdrawal, } from '../types'; import styles from './TransactionInfo.module.scss'; @@ -48,7 +49,7 @@ const TransactionAddressMobile = (props: { address: string }) => ); -type AddressInputOutput = ITransactionInput | ITransactionOutput; +type AddressInputOutput = ITransactionInput | IWithdrawal | ITransactionOutput; interface IAddressesRowProps { addresses?: Array; @@ -203,7 +204,7 @@ const TransactionInfo = (props: ITransactionInfoProps) => {
diff --git a/source/features/transactions/types.ts b/source/features/transactions/types.ts index cb44125c..2a29265c 100644 --- a/source/features/transactions/types.ts +++ b/source/features/transactions/types.ts @@ -13,6 +13,10 @@ export interface ITransactionOutput extends ICoin { index: number; } +export interface IWithdrawal extends ICoin { + address: string; +} + export interface ITransactionDetails { block: { epoch?: number | '-'; @@ -27,4 +31,5 @@ export interface ITransactionDetails { inputs: ITransactionInput[]; outputs?: ITransactionOutput[]; totalOutput: string; + withdrawals: IWithdrawal[]; } From c8ee6a2ac09072ffb57362f9fedd475bd4a9e73f Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Tue, 22 Sep 2020 22:45:06 +1000 Subject: [PATCH 04/13] feat: resolve stake address searches based on withdrawals searchForAddress is now separated into searchForPaymentAddress and searchForStakeAddress, determined by using the bech32 prefix. Closes #352 --- source/features/address/api/transformers.ts | 45 ++++++++++---- source/features/address/types.ts | 10 ++- source/features/address/ui/AddressSummary.tsx | 50 ++++++++++++--- source/features/i18n/translations/de.json | 9 +-- source/features/i18n/translations/en.json | 9 +-- source/features/i18n/translations/ja.json | 9 +-- source/features/search/api/index.ts | 28 ++++++--- ...raphql => searchForPaymentAddress.graphql} | 2 +- .../search/api/searchForStakeAddress.graphql | 38 ++++++++++++ source/features/search/index.ts | 6 +- .../specs/helpers/exampleAddressData.ts | 8 ++- .../search/specs/searchForAddress.spec.ts | 34 ---------- .../specs/searchForPaymentAddress.spec.ts | 34 ++++++++++ .../specs/searchForStakeAddress.spec.ts | 34 ++++++++++ source/features/search/store.ts | 62 ++++++++++++++----- .../search/ui/AddressSearchResult.tsx | 49 +++++++++------ .../api/getAddressTransactions.graphql | 6 ++ 17 files changed, 323 insertions(+), 110 deletions(-) rename source/features/search/api/{searchForAddress.graphql => searchForPaymentAddress.graphql} (95%) create mode 100644 source/features/search/api/searchForStakeAddress.graphql delete mode 100644 source/features/search/specs/searchForAddress.spec.ts create mode 100644 source/features/search/specs/searchForPaymentAddress.spec.ts create mode 100644 source/features/search/specs/searchForStakeAddress.spec.ts diff --git a/source/features/address/api/transformers.ts b/source/features/address/api/transformers.ts index 538f3872..e1e6afbf 100644 --- a/source/features/address/api/transformers.ts +++ b/source/features/address/api/transformers.ts @@ -1,15 +1,36 @@ import { Currency } from 'cardano-js'; -import { SearchForAddressQuery } from '../../../../generated/typings/graphql-schema'; -import { IAddressSummary } from '../types'; +import { + SearchForPaymentAddressQuery, + SearchForStakeAddressQuery, +} from '../../../../generated/typings/graphql-schema'; +import { IPaymentAddressSummary, IStakeAddressSummary } from '../types'; -export const addressDetailTransformer = ( +export const paymentAddressDetailTransformer = ( address: string, - s: SearchForAddressQuery -): IAddressSummary => ({ - address, - finalBalance: Currency.Util.lovelacesToAda( - s.utxos_aggregate?.aggregate?.sum?.value || '0' - ), - transactionsCount: - s.transactions_aggregate?.aggregate?.count.toString() || '0', -}); + s: SearchForPaymentAddressQuery +): IPaymentAddressSummary => { + return { + address, + finalBalance: Currency.Util.lovelacesToAda( + s.utxos_aggregate?.aggregate?.sum?.value || '0' + ), + transactionsCount: + s.transactions_aggregate?.aggregate?.count.toString() || '0' + } +}; + +export const stakeAddressDetailTransformer = ( + address: string, + s: SearchForStakeAddressQuery +): IStakeAddressSummary => { + return { + address, + totalWithdrawals: + s.withdrawals_aggregate?.aggregate?.count.toString() || '0', + totalWithdrawn: Currency.Util.lovelacesToAda( + s.withdrawals_aggregate?.aggregate?.sum?.amount || '0' + ), + transactionsCount: + s.transactions_aggregate?.aggregate?.count.toString() || '0' + } +}; diff --git a/source/features/address/types.ts b/source/features/address/types.ts index 2cf26c3a..5789f357 100644 --- a/source/features/address/types.ts +++ b/source/features/address/types.ts @@ -1,5 +1,13 @@ export interface IAddressSummary { address: string; - finalBalance: string; transactionsCount: string; } + +export interface IPaymentAddressSummary extends IAddressSummary { + finalBalance: string; +} + +export interface IStakeAddressSummary extends IAddressSummary { + totalWithdrawals: string; + totalWithdrawn: string; +} diff --git a/source/features/address/ui/AddressSummary.tsx b/source/features/address/ui/AddressSummary.tsx index b8936e0b..6b7953a6 100644 --- a/source/features/address/ui/AddressSummary.tsx +++ b/source/features/address/ui/AddressSummary.tsx @@ -6,12 +6,30 @@ import styles from './AddressSummary.module.scss'; export interface IAddressSummaryProps { address: string; - finalBalance: string; title: string; transactionsCount: string; } -const AddressSummary = (props: IAddressSummaryProps) => { +export interface IPaymentAddressSummaryProps extends IAddressSummaryProps { + finalBalance: string; +} + +export interface IStakeAddressSummaryProps extends IAddressSummaryProps { + totalWithdrawn: string; + totalWithdrawals: string; +} + +type AddressSummaryProps = IPaymentAddressSummaryProps | IStakeAddressSummaryProps + +function isPaymentAddress (props: AddressSummaryProps): props is IPaymentAddressSummaryProps { + return (props as IPaymentAddressSummaryProps).finalBalance !== undefined; +} + +function isStakeAddress (props: AddressSummaryProps): props is IStakeAddressSummaryProps { + return (props as IStakeAddressSummaryProps).totalWithdrawn !== undefined; +} + +const AddressSummary = (props: AddressSummaryProps) => { const { translate } = useI18nFeature().store; return (
@@ -32,12 +50,30 @@ const AddressSummary = (props: IAddressSummaryProps) => {
{props.transactionsCount}
-
-
- {translate('address.summaryBalanceLabel')} + {isPaymentAddress(props) && ( +
+
+ {translate('address.summaryBalanceLabel')} +
+
{props.finalBalance} ADA
-
{props.finalBalance} ADA
-
+ )} + {isStakeAddress(props) && ( + <> +
+
+ {translate('withdrawals')} +
+
{props.totalWithdrawals}
+
+
+
+ {translate('address.totalWithdrawn')} +
+
{props.totalWithdrawn} ADA
+
+ + )}
; + + public searchForStakeAddressQuery: GraphQLRequest< + SearchForStakeAddressQuery, + SearchForStakeAddressQueryVariables >; public searchByIdQuery: GraphQLRequest< @@ -37,9 +45,13 @@ export class SearchApi { >; constructor(client: GraphQLClient) { - this.searchForAddressQuery = new GraphQLRequest( + this.searchForPaymentAddressQuery = new GraphQLRequest( + client, + searchForPaymentAddressQuery + ); + this.searchForStakeAddressQuery = new GraphQLRequest( client, - searchForAddressQuery + searchForStakeAddressQuery ); this.searchByIdQuery = new GraphQLRequest(client, searchByIdQuery); this.searchForBlockByNumberQuery = new GraphQLRequest( diff --git a/source/features/search/api/searchForAddress.graphql b/source/features/search/api/searchForPaymentAddress.graphql similarity index 95% rename from source/features/search/api/searchForAddress.graphql rename to source/features/search/api/searchForPaymentAddress.graphql index bcb06fc8..0b03e242 100644 --- a/source/features/search/api/searchForAddress.graphql +++ b/source/features/search/api/searchForPaymentAddress.graphql @@ -1,4 +1,4 @@ -query searchForAddress( +query searchForPaymentAddress( $address: String! ) { utxos_aggregate ( diff --git a/source/features/search/api/searchForStakeAddress.graphql b/source/features/search/api/searchForStakeAddress.graphql new file mode 100644 index 00000000..e479bb4a --- /dev/null +++ b/source/features/search/api/searchForStakeAddress.graphql @@ -0,0 +1,38 @@ +#import "../../transactions/api/TransactionDetails.graphql" + +query searchForStakeAddress( + $address: String! +) { + transactions_aggregate ( + where: { + withdrawals: { + address: { + _eq: $address + } + } + } + ) { + aggregate { + count + } + } + withdrawals { + transaction { + ...TransactionDetails + } + } + withdrawals_aggregate ( + where: { + address: { + _eq: $address + } + } + ) { + aggregate { + count + sum { + amount + } + } + } +} diff --git a/source/features/search/index.ts b/source/features/search/index.ts index 410338f0..623e8027 100644 --- a/source/features/search/index.ts +++ b/source/features/search/index.ts @@ -10,16 +10,18 @@ import { SearchStore } from './store'; * Defines the actions that are supported by this feature */ export class SearchActions { + public addressNotFound: Action<{ address: string }> = new Action(); public addressSearchRequested: Action<{ address: string }> = new Action(); public blockNumberSearchRequested: Action<{ number: number }> = new Action(); public epochNumberSearchRequested: Action<{ number: number }> = new Action(); public idSearchRequested: Action<{ id: string }> = new Action(); - public unknownSearchRequested: Action<{ query: string }> = new Action(); public searchById: Action<{ id: string }> = new Action(); - public searchForAddress: Action<{ address: string }> = new Action(); + public searchForPaymentAddress: Action<{ address: string }> = new Action(); + public searchForStakeAddress: Action<{ address: string }> = new Action(); public searchForBlockByNumber: Action<{ number: number }> = new Action(); public searchForEpochByNumber: Action<{ number: 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/exampleAddressData.ts b/source/features/search/specs/helpers/exampleAddressData.ts index 77521578..330afe6c 100644 --- a/source/features/search/specs/helpers/exampleAddressData.ts +++ b/source/features/search/specs/helpers/exampleAddressData.ts @@ -1,4 +1,4 @@ -export const exampleAddressData = { +export const examplePaymentAddressData = { address: 'Ae2tdPwUPEZBZTsRj7nGvvWQDTkqD9KLpCPpuZvjA1roL7KLDDVgkPU5S8j', finalBalance: '0', transactions: [ @@ -25,3 +25,9 @@ export const exampleAddressData = { ], transactionsCount: '2', }; + +export const exampleStakeAddressData = { + address: 'stake1u8gu2vzsk2nc6hsphudhl3p6aum7nd59ajqjg9zp00uvxcqwsdray', + totalWithdrawn: '1563.774139', + transactionsCount: '1', +}; diff --git a/source/features/search/specs/searchForAddress.spec.ts b/source/features/search/specs/searchForAddress.spec.ts deleted file mode 100644 index 940f2ac2..00000000 --- a/source/features/search/specs/searchForAddress.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import waitForExpect from 'wait-for-expect'; -import { ISearchFeature } from '../index'; -import { exampleAddressData } from './helpers/exampleAddressData'; -import { setupSearchFeature } from './helpers/setup'; - -describe('Searching for an address summary', () => { - let search: ISearchFeature; - beforeEach(() => { - search = setupSearchFeature(); - search.start(); - }); - afterEach(() => { - search.stop(); - }); - it('searches for a summary related to the provided address', async () => { - // 1. Trigger action - search.actions.searchForAddress.trigger({ - address: exampleAddressData.address, - }); - - // 2. Check the API query status - expect(search.api.searchForAddressQuery.isExecuting).toBe(true); - - // 3. Access the observable search result provided by the store - await waitForExpect(() => { - expect(search.store?.addressSearchResult?.finalBalance).toBe( - exampleAddressData.finalBalance - ); - expect(search.store?.addressSearchResult?.transactionsCount).toBe( - exampleAddressData.transactionsCount - ); - }); - }); -}); diff --git a/source/features/search/specs/searchForPaymentAddress.spec.ts b/source/features/search/specs/searchForPaymentAddress.spec.ts new file mode 100644 index 00000000..3529f2b1 --- /dev/null +++ b/source/features/search/specs/searchForPaymentAddress.spec.ts @@ -0,0 +1,34 @@ +import waitForExpect from 'wait-for-expect'; +import { ISearchFeature } from '../index'; +import { examplePaymentAddressData } from './helpers/exampleAddressData'; +import { setupSearchFeature } from './helpers/setup'; + +describe('Searching for a payment address summary', () => { + let search: ISearchFeature; + beforeEach(() => { + search = setupSearchFeature(); + search.start(); + }); + afterEach(() => { + search.stop(); + }); + it('searches for a summary related to the provided payment address', async () => { + // 1. Trigger action + search.actions.searchForPaymentAddress.trigger({ + address: examplePaymentAddressData.address, + }); + + // 2. Check the API query status + expect(search.api.searchForPaymentAddressQuery.isExecuting).toBe(true); + + // 3. Access the observable search result provided by the store + await waitForExpect(() => { + expect(search.store?.paymentAddressSearchResult?.finalBalance).toBe( + examplePaymentAddressData.finalBalance + ); + expect(search.store?.paymentAddressSearchResult?.transactionsCount).toBe( + examplePaymentAddressData.transactionsCount + ); + }); + }); +}); diff --git a/source/features/search/specs/searchForStakeAddress.spec.ts b/source/features/search/specs/searchForStakeAddress.spec.ts new file mode 100644 index 00000000..123de9f7 --- /dev/null +++ b/source/features/search/specs/searchForStakeAddress.spec.ts @@ -0,0 +1,34 @@ +import waitForExpect from 'wait-for-expect'; +import { ISearchFeature } from '../index'; +import { exampleStakeAddressData } from './helpers/exampleAddressData'; +import { setupSearchFeature } from './helpers/setup'; + +describe('Searching for a stake address summary', () => { + let search: ISearchFeature; + beforeEach(() => { + search = setupSearchFeature(); + search.start(); + }); + afterEach(() => { + search.stop(); + }); + it('searches for a summary related to the provided stake address', async () => { + // 1. Trigger action + search.actions.searchForStakeAddress.trigger({ + address: exampleStakeAddressData.address, + }); + + // 2. Check the API query status + expect(search.api.searchForStakeAddressQuery.isExecuting).toBe(true); + + // 3. Access the observable search result provided by the store + await waitForExpect(() => { + expect(search.store?.stakeAddressSearchResult?.totalWithdrawn).toBe( + exampleStakeAddressData.totalWithdrawn + ); + expect(search.store?.stakeAddressSearchResult?.transactionsCount).toBe( + exampleStakeAddressData.transactionsCount + ); + }); + }); +}); diff --git a/source/features/search/store.ts b/source/features/search/store.ts index 20774556..d367fbbc 100644 --- a/source/features/search/store.ts +++ b/source/features/search/store.ts @@ -3,9 +3,12 @@ import { ActionProps, createActionBindings } from '../../lib/ActionBinding'; import Reaction, { createReactions } from '../../lib/mobx/Reaction'; import { Store } from '../../lib/Store'; import { isDefined } from '../../lib/types'; -import { addressDetailTransformer } from '../address/api/transformers'; +import { + paymentAddressDetailTransformer, + stakeAddressDetailTransformer +} from '../address/api/transformers'; import { ADDRESS_SEARCH_RESULT_PATH } from '../address/config'; -import { IAddressSummary } from '../address/types'; +import { IAddressSummary, IPaymentAddressSummary, IStakeAddressSummary } from '../address/types'; import { blockDetailsTransformer } from '../blocks/api/transformers'; import { BLOCK_SEARCH_RESULT_PATH } from '../blocks/config'; import { IBlockDetailed } from '../blocks/types'; @@ -31,9 +34,10 @@ export enum SearchType { } export class SearchStore extends Store { - @observable public addressSearchResult: IAddressSummary | null = null; @observable public blockSearchResult: IBlockDetailed | null = null; @observable public epochSearchResult: IEpochOverview | null = null; + @observable public paymentAddressSearchResult: IPaymentAddressSummary | null = null; + @observable public stakeAddressSearchResult: IStakeAddressSummary | null = null; @observable public transactionSearchResult: ITransactionDetails | null = null; private readonly searchApi: SearchApi; @@ -71,7 +75,8 @@ export class SearchStore extends Store { this.onSearchByEpochNumberRequested, ], [this.searchActions.searchById, this.searchById], - [this.searchActions.searchForAddress, this.searchForAddress], + [this.searchActions.searchForPaymentAddress, this.searchForPaymentAddress], + [this.searchActions.searchForStakeAddress, this.searchForStakeAddress], [ this.searchActions.searchForBlockByNumber, this.searchForBlockByNumber, @@ -98,11 +103,12 @@ export class SearchStore extends Store { @computed get isSearching() { return ( - this.searchApi.searchForAddressQuery.isExecuting || - this.searchApi.searchForBlockByNumberQuery.isExecuting || this.searchApi.searchByIdQuery.isExecuting || this.searchApi.searchForBlockByNumberQuery.isExecuting || - this.searchApi.searchForEpochByNumberQuery.isExecuting + this.searchApi.searchForBlockByNumberQuery.isExecuting || + this.searchApi.searchForEpochByNumberQuery.isExecuting || + this.searchApi.searchForPaymentAddressQuery.isExecuting || + this.searchApi.searchForStakeAddressQuery.isExecuting ); } @@ -189,20 +195,20 @@ export class SearchStore extends Store { }); }; - @action private searchForAddress = async ({ - address, + @action private searchForPaymentAddress = async ({ + address }: { address: string; }) => { // Do not execute queries more than necessary! if ( - this.searchApi.searchForAddressQuery.isExecuting || - this.addressSearchResult?.address === address + this.searchApi.searchForPaymentAddressQuery.isExecuting || + this.paymentAddressSearchResult?.address === address ) { return; } - this.addressSearchResult = null; - const result = await this.searchApi.searchForAddressQuery.execute({ + this.paymentAddressSearchResult = null; + const result = await this.searchApi.searchForPaymentAddressQuery.execute({ address, }); if (isDefined(result)) { @@ -215,7 +221,35 @@ export class SearchStore extends Store { }); } runInAction(() => { - this.addressSearchResult = addressDetailTransformer(address, result); + this.paymentAddressSearchResult = paymentAddressDetailTransformer(address, result); + }); + } + }; + + @action private searchForStakeAddress = async ({ + address, + }: { + address: string; + }) => { + // Do not execute queries more than necessary! + if ( + this.searchApi.searchForStakeAddressQuery.isExecuting || + this.stakeAddressSearchResult?.address === address + ) { + return; + } + this.stakeAddressSearchResult = null; + const result = await this.searchApi.searchForStakeAddressQuery.execute({ + address, + }); + if (isDefined(result)) { + if (result.withdrawals_aggregate?.aggregate?.count === '0') { + return this.searchActions.unknownSearchRequested.trigger({ + query: address, + }); + } + runInAction(() => { + this.stakeAddressSearchResult = stakeAddressDetailTransformer(address, result); }); } }; diff --git a/source/features/search/ui/AddressSearchResult.tsx b/source/features/search/ui/AddressSearchResult.tsx index 963ff88f..64fab89c 100644 --- a/source/features/search/ui/AddressSearchResult.tsx +++ b/source/features/search/ui/AddressSearchResult.tsx @@ -25,36 +25,49 @@ export const AddressSearchResult = () => { const { query } = navigation.store; const { address } = query; if (isString(address)) { - actions.searchForAddress.trigger({ address }); + if (address.substring(0, 5) === 'stake') { + actions.searchForStakeAddress.trigger({ address }); + } else { + actions.searchForPaymentAddress.trigger({ address }); + } } }); return ( {() => { - const { addressSearchResult } = store; + const { paymentAddressSearchResult, stakeAddressSearchResult } = store; + const address = paymentAddressSearchResult?.address || stakeAddressSearchResult?.address || null; + const transactionsCount = paymentAddressSearchResult?.transactionsCount || stakeAddressSearchResult?.transactionsCount; if ( - !api.searchForAddressQuery.hasBeenExecutedAtLeastOnce || + ( paymentAddressSearchResult && !api.searchForPaymentAddressQuery.hasBeenExecutedAtLeastOnce ) || + ( stakeAddressSearchResult && !api.searchForStakeAddressQuery.hasBeenExecutedAtLeastOnce ) || store.isSearching ) { return ; - } else if (addressSearchResult) { - const { - address, - finalBalance, - transactionsCount, - } = addressSearchResult; + } else if (address !== null && transactionsCount !== null) { return ( <>
- + { paymentAddressSearchResult && ( + + )} + { stakeAddressSearchResult && ( + + )}
- { }} perPage={navigation.store.query.perPage as string} currentPage={(navigation.store.query.page as string) ?? 1} - total={parseInt(transactionsCount, 10)} + total={parseInt(paymentAddressSearchResult?.transactionsCount || stakeAddressSearchResult?.transactionsCount || '0', 10)} transactions={transactions.store.browsedAddressTransactions} - /> + />}
); diff --git a/source/features/transactions/api/getAddressTransactions.graphql b/source/features/transactions/api/getAddressTransactions.graphql index 387bff5e..5aaf7cb5 100644 --- a/source/features/transactions/api/getAddressTransactions.graphql +++ b/source/features/transactions/api/getAddressTransactions.graphql @@ -8,6 +8,12 @@ query getAddressTransactions( transactions( where: { _or: [{ + withdrawals: { + address: { + _eq: $address + } + } + }, { inputs: { address: { _eq: $address From 0f345dd2c3ee6287a821167cfcf45cba55e8ee16 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Wed, 23 Sep 2020 00:03:41 +1000 Subject: [PATCH 05/13] feat: use stake pool hash over slot leader reference when a block is created by a stake pool, the pool hash is now used. BFT nodes still use the slot leader reference Closes #355 --- source/features/blocks/api/BlockOverview.graphql | 3 +++ source/features/blocks/api/transformers.ts | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/source/features/blocks/api/BlockOverview.graphql b/source/features/blocks/api/BlockOverview.graphql index 766f6b6a..18d3c2df 100644 --- a/source/features/blocks/api/BlockOverview.graphql +++ b/source/features/blocks/api/BlockOverview.graphql @@ -2,6 +2,9 @@ fragment BlockOverview on Block { forgedAt slotLeader { description + stakePool { + hash + } } epochNo, hash diff --git a/source/features/blocks/api/transformers.ts b/source/features/blocks/api/transformers.ts index 4b140222..3d61812f 100644 --- a/source/features/blocks/api/transformers.ts +++ b/source/features/blocks/api/transformers.ts @@ -16,10 +16,13 @@ export const blockOverviewTransformer = ( } else { epoch = b.epochNo; } + const createdBy = b.slotLeader.stakePool?.hash !== undefined ? + shortenCreatedBy(b.slotLeader.stakePool.hash) : + formatSlotLeaderDescription(b.slotLeader.description) return { ...b, createdAt: b.forgedAt, - createdBy: formatCreatedBy(b.slotLeader.description), + createdBy, epoch, id: b.hash, number: b.number || '-', @@ -50,7 +53,11 @@ export const blockDetailsTransformer = ( .map(transactionDetailsTransformer), }); -function formatCreatedBy(value: IBlockOverview['createdBy']): string { +function shortenCreatedBy (createdBy: string) { + return createdBy.substring(0, 7) +} + +function formatSlotLeaderDescription (value: IBlockOverview['createdBy']): string { switch (value) { case 'Genesis slot leader': return 'Genesis'; @@ -61,7 +68,7 @@ function formatCreatedBy(value: IBlockOverview['createdBy']): string { if (!Array.isArray(selection)) { return ''; } - return selection[1].substring(0, 7); + return shortenCreatedBy(selection[1]); } } From 7231010ab0f9e23d48eeb5f6dbeb4c51781912f7 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Wed, 23 Sep 2020 14:55:20 +1000 Subject: [PATCH 06/13] chore: bump versions, update changelog --- CHANGELOG.md | 16 +++++++++++++++- package.json | 4 ++-- .../@cardano-graphql-client-ts-2.2.0-beta.tgz | Bin 17109 -> 0 bytes .../@cardano-graphql-client-ts-2.2.0.tgz | Bin 0 -> 17096 bytes yarn.lock | 8 ++++---- 5 files changed, 21 insertions(+), 7 deletions(-) delete mode 100644 packages-cache/@cardano-graphql-client-ts-2.2.0-beta.tgz create mode 100644 packages-cache/@cardano-graphql-client-ts-2.2.0.tgz diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b4c64b4..ebc3c008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,23 @@ Changelog ========= +## 1.2.0 + +### Compatible with: + +- [`cardano-graphql`: `2.2.0`](https://github.com/input-output-hk/cardano-graphql/releases/tag/2.2.0) + +### Features +- [show deposits and reclaims when present in transaction](https://github.com/input-output-hk/cardano-explorer-app/pull/361) +- [add withdrawals to TransactionInfo](https://github.com/input-output-hk/cardano-explorer-app/pull/363) +- [resolve stake address searches based on withdrawals](https://github.com/input-output-hk/cardano-explorer-app/pull/363) +- [use stake pool hash over slot leader reference](https://github.com/input-output-hk/cardano-explorer-app/pull/364) +### Chores +- [use new combined cardano-graphql schema from client package, removing local build step](https://github.com/input-output-hk/cardano-explorer-app/pull/362) + ## 1.1.0 ### Features -- [Split slots & blocks into separate columns](https://github.com/input-output-hk/cardano-explorer-app/pull/338) +- [Split slots & blocks into separate columns](https://github.com/input-output-hk/cardano-explorer-app/pull/347) - [Add package.json version to footer](https://github.com/input-output-hk/cardano-explorer-app/pull/348) ### Chores - [Dynamically calc Byron epochs length](https://github.com/input-output-hk/cardano-explorer-app/pull/334) diff --git a/package.json b/package.json index b2fb8943..d77f5c69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cardano-explorer-app", - "version": "1.1.0", + "version": "1.2.0", "description": "Cardano Explorer App", "author": "Daedalus Team @ Input Output HK", "license": "Apache-2.0", @@ -71,7 +71,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": "2.2.0-beta", + "@cardano-graphql/client-ts": "2.2.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-2.2.0-beta.tgz b/packages-cache/@cardano-graphql-client-ts-2.2.0-beta.tgz deleted file mode 100644 index f1d5beaa4be78f4bc49feb97d98ffb7bd3959203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17109 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 Date: Thu, 24 Sep 2020 12:59:32 +1000 Subject: [PATCH 07/13] fix: clear all address search results prior to sending new query --- source/features/search/store.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/features/search/store.ts b/source/features/search/store.ts index d367fbbc..19e0c0a2 100644 --- a/source/features/search/store.ts +++ b/source/features/search/store.ts @@ -208,6 +208,7 @@ export class SearchStore extends Store { return; } this.paymentAddressSearchResult = null; + this.stakeAddressSearchResult = null; const result = await this.searchApi.searchForPaymentAddressQuery.execute({ address, }); @@ -239,6 +240,7 @@ export class SearchStore extends Store { return; } this.stakeAddressSearchResult = null; + this.paymentAddressSearchResult = null; const result = await this.searchApi.searchForStakeAddressQuery.execute({ address, }); From 5353473517171ef76ce493db2f80b6353822c1b6 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Wed, 30 Sep 2020 00:40:02 +1000 Subject: [PATCH 08/13] Revert "feat: use stake pool hash over slot leader reference" This reverts commit 0f345dd2 --- source/features/blocks/api/BlockOverview.graphql | 3 --- source/features/blocks/api/transformers.ts | 13 +++---------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/source/features/blocks/api/BlockOverview.graphql b/source/features/blocks/api/BlockOverview.graphql index 18d3c2df..766f6b6a 100644 --- a/source/features/blocks/api/BlockOverview.graphql +++ b/source/features/blocks/api/BlockOverview.graphql @@ -2,9 +2,6 @@ fragment BlockOverview on Block { forgedAt slotLeader { description - stakePool { - hash - } } epochNo, hash diff --git a/source/features/blocks/api/transformers.ts b/source/features/blocks/api/transformers.ts index 3d61812f..4b140222 100644 --- a/source/features/blocks/api/transformers.ts +++ b/source/features/blocks/api/transformers.ts @@ -16,13 +16,10 @@ export const blockOverviewTransformer = ( } else { epoch = b.epochNo; } - const createdBy = b.slotLeader.stakePool?.hash !== undefined ? - shortenCreatedBy(b.slotLeader.stakePool.hash) : - formatSlotLeaderDescription(b.slotLeader.description) return { ...b, createdAt: b.forgedAt, - createdBy, + createdBy: formatCreatedBy(b.slotLeader.description), epoch, id: b.hash, number: b.number || '-', @@ -53,11 +50,7 @@ export const blockDetailsTransformer = ( .map(transactionDetailsTransformer), }); -function shortenCreatedBy (createdBy: string) { - return createdBy.substring(0, 7) -} - -function formatSlotLeaderDescription (value: IBlockOverview['createdBy']): string { +function formatCreatedBy(value: IBlockOverview['createdBy']): string { switch (value) { case 'Genesis slot leader': return 'Genesis'; @@ -68,7 +61,7 @@ function formatSlotLeaderDescription (value: IBlockOverview['createdBy']): strin if (!Array.isArray(selection)) { return ''; } - return shortenCreatedBy(selection[1]); + return selection[1].substring(0, 7); } } From 5ed9fbaaf3e7d00eac77142e655c281421325a57 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Tue, 27 Oct 2020 03:52:22 +1100 Subject: [PATCH 09/13] chore: bump @cardano-graphql/client-ts, minimal compat update --- codegen.yml | 2 +- package.json | 2 +- .../@cardano-graphql-client-ts-2.2.0.tgz | Bin 17096 -> 0 bytes .../@cardano-graphql-client-ts-3.0.0.tgz | Bin 0 -> 18045 bytes source/features/search/api/searchById.graphql | 2 +- .../search/api/searchForStakeAddress.graphql | 2 +- .../api/searchForTransactionById.graphql | 2 +- .../specs/helpers/exampleAddressData.ts | 4 +- .../specs/searchForStakeAddress.spec.ts | 8 +++- .../search/ui/AddressSearchResult.tsx | 17 +++++--- .../api/getBlockTransactions.graphql | 2 +- ... => getPaymentAddressTransactions.graphql} | 8 +--- .../api/getStakeAddressTransactions.graphql | 21 ++++++++++ source/features/transactions/api/index.ts | 27 +++++++++---- source/features/transactions/store.ts | 37 ++++++++++++------ yarn.lock | 8 ++-- 16 files changed, 97 insertions(+), 45 deletions(-) delete mode 100644 packages-cache/@cardano-graphql-client-ts-2.2.0.tgz create mode 100644 packages-cache/@cardano-graphql-client-ts-3.0.0.tgz rename source/features/transactions/api/{getAddressTransactions.graphql => getPaymentAddressTransactions.graphql} (75%) create mode 100644 source/features/transactions/api/getStakeAddressTransactions.graphql diff --git a/codegen.yml b/codegen.yml index cbb645d7..dc9ddff6 100644 --- a/codegen.yml +++ b/codegen.yml @@ -1,5 +1,5 @@ overwrite: true -schema: node_modules/@cardano-graphql/client-ts/api/schema.graphql +schema: node_modules/@cardano-graphql/client-ts/api/cardano-db-hasura/schema.graphql documents: "source/**/*.graphql" generates: generated/typings/graphql-schema.d.ts: diff --git a/package.json b/package.json index d77f5c69..e4c1bc91 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,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": "2.2.0", + "@cardano-graphql/client-ts": "3.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-2.2.0.tgz b/packages-cache/@cardano-graphql-client-ts-2.2.0.tgz deleted file mode 100644 index 6ce23253312e74bef42bcf015bd1597d8fe9652c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17096 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 Q5BT^00QcM?2>|W^0C7KL00000 literal 0 HcmV?d00001 diff --git a/source/features/search/api/searchById.graphql b/source/features/search/api/searchById.graphql index b01bc122..8366064e 100644 --- a/source/features/search/api/searchById.graphql +++ b/source/features/search/api/searchById.graphql @@ -2,7 +2,7 @@ #import "../../transactions/api/TransactionDetails.graphql" query searchById( - $id: Hash32HexString! + $id: Hash32Hex! ) { blocks( where: { diff --git a/source/features/search/api/searchForStakeAddress.graphql b/source/features/search/api/searchForStakeAddress.graphql index e479bb4a..07279dc1 100644 --- a/source/features/search/api/searchForStakeAddress.graphql +++ b/source/features/search/api/searchForStakeAddress.graphql @@ -1,7 +1,7 @@ #import "../../transactions/api/TransactionDetails.graphql" query searchForStakeAddress( - $address: String! + $address: StakeAddress! ) { transactions_aggregate ( where: { diff --git a/source/features/search/api/searchForTransactionById.graphql b/source/features/search/api/searchForTransactionById.graphql index ca367e67..d96fe04d 100644 --- a/source/features/search/api/searchForTransactionById.graphql +++ b/source/features/search/api/searchForTransactionById.graphql @@ -1,7 +1,7 @@ #import "../../transactions/api/TransactionDetails.graphql" query searchForTransactionById( - $id: Hash32HexString + $id: Hash32Hex ) { transactions( where: { diff --git a/source/features/search/specs/helpers/exampleAddressData.ts b/source/features/search/specs/helpers/exampleAddressData.ts index 330afe6c..b8b71998 100644 --- a/source/features/search/specs/helpers/exampleAddressData.ts +++ b/source/features/search/specs/helpers/exampleAddressData.ts @@ -28,6 +28,6 @@ export const examplePaymentAddressData = { export const exampleStakeAddressData = { address: 'stake1u8gu2vzsk2nc6hsphudhl3p6aum7nd59ajqjg9zp00uvxcqwsdray', - totalWithdrawn: '1563.774139', - transactionsCount: '1', + totalWithdrawn: 1563.774139, + transactionsCount: 1, }; diff --git a/source/features/search/specs/searchForStakeAddress.spec.ts b/source/features/search/specs/searchForStakeAddress.spec.ts index 123de9f7..960883e0 100644 --- a/source/features/search/specs/searchForStakeAddress.spec.ts +++ b/source/features/search/specs/searchForStakeAddress.spec.ts @@ -23,10 +23,14 @@ describe('Searching for a stake address summary', () => { // 3. Access the observable search result provided by the store await waitForExpect(() => { - expect(search.store?.stakeAddressSearchResult?.totalWithdrawn).toBe( + expect( + parseFloat(search.store?.stakeAddressSearchResult?.totalWithdrawn as string) + ).toBeGreaterThanOrEqual( exampleStakeAddressData.totalWithdrawn ); - expect(search.store?.stakeAddressSearchResult?.transactionsCount).toBe( + expect( + parseInt(search.store?.stakeAddressSearchResult?.transactionsCount as string) + ).toBeGreaterThanOrEqual( exampleStakeAddressData.transactionsCount ); }); diff --git a/source/features/search/ui/AddressSearchResult.tsx b/source/features/search/ui/AddressSearchResult.tsx index 64fab89c..764a3b28 100644 --- a/source/features/search/ui/AddressSearchResult.tsx +++ b/source/features/search/ui/AddressSearchResult.tsx @@ -36,8 +36,11 @@ export const AddressSearchResult = () => { {() => { const { paymentAddressSearchResult, stakeAddressSearchResult } = store; - const address = paymentAddressSearchResult?.address || stakeAddressSearchResult?.address || null; - const transactionsCount = paymentAddressSearchResult?.transactionsCount || stakeAddressSearchResult?.transactionsCount; + const address = paymentAddressSearchResult?.address || + stakeAddressSearchResult?.address || + null; + const transactionsCount = paymentAddressSearchResult?.transactionsCount || + stakeAddressSearchResult?.transactionsCount; if ( ( paymentAddressSearchResult && !api.searchForPaymentAddressQuery.hasBeenExecutedAtLeastOnce ) || ( stakeAddressSearchResult && !api.searchForStakeAddressQuery.hasBeenExecutedAtLeastOnce ) || @@ -69,10 +72,13 @@ export const AddressSearchResult = () => {
{ { @@ -96,7 +102,8 @@ export const AddressSearchResult = () => { }} perPage={navigation.store.query.perPage as string} currentPage={(navigation.store.query.page as string) ?? 1} - total={parseInt(paymentAddressSearchResult?.transactionsCount || stakeAddressSearchResult?.transactionsCount || '0', 10)} + total={parseInt(paymentAddressSearchResult?.transactionsCount || + stakeAddressSearchResult?.transactionsCount || '0', 10)} transactions={transactions.store.browsedAddressTransactions} />}
diff --git a/source/features/transactions/api/getBlockTransactions.graphql b/source/features/transactions/api/getBlockTransactions.graphql index 8c951c68..a7e54c2c 100644 --- a/source/features/transactions/api/getBlockTransactions.graphql +++ b/source/features/transactions/api/getBlockTransactions.graphql @@ -1,7 +1,7 @@ #import "./TransactionDetails.graphql" query getBlockTransactions( - $blockId: Hash32HexString! + $blockId: Hash32Hex! $offset: Int! $limit: Int! ) { diff --git a/source/features/transactions/api/getAddressTransactions.graphql b/source/features/transactions/api/getPaymentAddressTransactions.graphql similarity index 75% rename from source/features/transactions/api/getAddressTransactions.graphql rename to source/features/transactions/api/getPaymentAddressTransactions.graphql index 5aaf7cb5..f5847ae3 100644 --- a/source/features/transactions/api/getAddressTransactions.graphql +++ b/source/features/transactions/api/getPaymentAddressTransactions.graphql @@ -1,6 +1,6 @@ #import "./TransactionDetails.graphql" -query getAddressTransactions( +query getPaymentAddressTransactions( $address: String! $offset: Int! $limit: Int! @@ -8,12 +8,6 @@ query getAddressTransactions( transactions( where: { _or: [{ - withdrawals: { - address: { - _eq: $address - } - } - }, { inputs: { address: { _eq: $address diff --git a/source/features/transactions/api/getStakeAddressTransactions.graphql b/source/features/transactions/api/getStakeAddressTransactions.graphql new file mode 100644 index 00000000..bd3da2bf --- /dev/null +++ b/source/features/transactions/api/getStakeAddressTransactions.graphql @@ -0,0 +1,21 @@ +#import "./TransactionDetails.graphql" + +query getStakeAddressTransactions( + $address: StakeAddress! + $offset: Int! + $limit: Int! +) { + transactions( + where: { + withdrawals: { + address: { + _eq: $address + } + } + } + offset: $offset + limit: $limit + ) { + ...TransactionDetails + } +} diff --git a/source/features/transactions/api/index.ts b/source/features/transactions/api/index.ts index 665ef0db..0fc28931 100644 --- a/source/features/transactions/api/index.ts +++ b/source/features/transactions/api/index.ts @@ -1,31 +1,42 @@ import { GraphQLClient } from 'graphql-request'; import { - GetAddressTransactionsQuery, - GetAddressTransactionsQueryVariables, GetBlockTransactionsQuery, GetBlockTransactionsQueryVariables, + GetPaymentAddressTransactionsQuery, + GetPaymentAddressTransactionsQueryVariables, + GetStakeAddressTransactionsQuery, + GetStakeAddressTransactionsQueryVariables, } from '../../../../generated/typings/graphql-schema'; import { GraphQLRequest } from '../../../lib/graphql/GraphQLRequest'; -import getAddressTransactions from './getAddressTransactions.graphql'; import getBlockTransactions from './getBlockTransactions.graphql'; +import getPaymentAddressTransactions from './getPaymentAddressTransactions.graphql'; +import getStakeAddressTransactions from './getStakeAddressTransactions.graphql'; export class TransactionsApi { public getBlockTransactionsQuery: GraphQLRequest< GetBlockTransactionsQuery, GetBlockTransactionsQueryVariables >; - public getAddressTransactionsQuery: GraphQLRequest< - GetAddressTransactionsQuery, - GetAddressTransactionsQueryVariables + public getPaymentAddressTransactionsQuery: GraphQLRequest< + GetPaymentAddressTransactionsQuery, + GetPaymentAddressTransactionsQueryVariables + >; + public getStakeAddressTransactionsQuery: GraphQLRequest< + GetStakeAddressTransactionsQuery, + GetStakeAddressTransactionsQueryVariables >; constructor(client: GraphQLClient) { this.getBlockTransactionsQuery = new GraphQLRequest( client, getBlockTransactions ); - this.getAddressTransactionsQuery = new GraphQLRequest( + this.getPaymentAddressTransactionsQuery = new GraphQLRequest( + client, + getPaymentAddressTransactions + ); + this.getStakeAddressTransactionsQuery = new GraphQLRequest( client, - getAddressTransactions + getStakeAddressTransactions ); } } diff --git a/source/features/transactions/store.ts b/source/features/transactions/store.ts index 62ea48ec..27d68206 100644 --- a/source/features/transactions/store.ts +++ b/source/features/transactions/store.ts @@ -37,17 +37,32 @@ export class TransactionsStore extends Store { typeof TransactionsActions.prototype.browseAddressTransactions > ): Promise => { - // Do not execute queries multiple times! - if (this.api.getAddressTransactionsQuery.isExecuting) { - return; - } - const result = await this.api.getAddressTransactionsQuery.execute(params); - if (result) { - runInAction(() => { - this.browsedAddressTransactions = result.transactions - .filter(isDefined) - .map(transactionDetailsTransformer); - }); + if (params.address.substring(0, 5) === 'stake') { + // Do not execute queries multiple times! + if (this.api.getStakeAddressTransactionsQuery.isExecuting) { + return; + } + const result = await this.api.getStakeAddressTransactionsQuery.execute(params); + if (result) { + runInAction(() => { + this.browsedAddressTransactions = result.transactions + .filter(isDefined) + .map(transactionDetailsTransformer); + }); + } + } else { + // Do not execute queries multiple times! + if (this.api.getPaymentAddressTransactionsQuery.isExecuting) { + return; + } + const result = await this.api.getPaymentAddressTransactionsQuery.execute(params); + if (result) { + runInAction(() => { + this.browsedAddressTransactions = result.transactions + .filter(isDefined) + .map(transactionDetailsTransformer); + }); + } } }; diff --git a/yarn.lock b/yarn.lock index 9d6fa36c..3a2cea7e 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@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cardano-graphql/client-ts/-/client-ts-2.2.0.tgz#a8f725ab642a9605f9c4aee3b78d2a637f568675" - integrity sha512-1ob9UboUijZxXllSlaYtsoOWM4EXcmPlKyhm1o5+kY2qkD7lRzOs6TBpJegrU4xQX+TGhLALawP+l6lNiHIsTg== +"@cardano-graphql/client-ts@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cardano-graphql/client-ts/-/client-ts-3.0.0.tgz#629fe7b4dcff75504d32f1beb6964d1ec8a93c7b" + integrity sha512-wmqTmnf8pc8GouLRB6Gm/GaXTidWi6sYFY4eJPm8C4ntS3JiP0Gb2LSv+Y5UqlZGxP8A8xq8hXUQp4/tAATWXA== "@cnakazawa/watch@^1.0.3": version "1.0.4" From cad9e3f48948cbe6bfb6f6adb795a6bc06fde2fb Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Thu, 12 Nov 2020 15:40:27 +1100 Subject: [PATCH 10/13] fix: scope withdrawals query to address --- source/features/search/api/searchForStakeAddress.graphql | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/features/search/api/searchForStakeAddress.graphql b/source/features/search/api/searchForStakeAddress.graphql index 07279dc1..f4b8283e 100644 --- a/source/features/search/api/searchForStakeAddress.graphql +++ b/source/features/search/api/searchForStakeAddress.graphql @@ -16,7 +16,13 @@ query searchForStakeAddress( count } } - withdrawals { + withdrawals ( + where: { + address: { + _eq: $address + } + } + ) { transaction { ...TransactionDetails } From 048e18bc930bc487e537515eb4d73c0aeefa859b Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Thu, 12 Nov 2020 16:00:01 +1100 Subject: [PATCH 11/13] chore: update changelog, bump version --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df83a2ae..ff7baa0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ Changelog ========= +## 1.2.1 + +### Compatible with: + +- [`cardano-graphql`: `3.0.0`](https://github.com/input-output-hk/cardano-graphql/releases/tag/3.0.0) + +Compatibility upgrade + +### Fixes +- scope withdrawals query to address ([cad9e3f](https://github.com/input-output-hk/cardano-explorer-app/commit/cad9e3f48948cbe6bfb6f6adb795a6bc06fde2fb)) + ## 1.2.0 ### Compatible with: diff --git a/package.json b/package.json index e4c1bc91..6f5ed47b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cardano-explorer-app", - "version": "1.2.0", + "version": "1.2.1", "description": "Cardano Explorer App", "author": "Daedalus Team @ Input Output HK", "license": "Apache-2.0", From 58c004a4422c01aef320802bb780361a93334a27 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Thu, 12 Nov 2020 22:28:40 +1100 Subject: [PATCH 12/13] fix: check search strings for shelley-era addresses, to avoid clash with testnet stake addresses and hashes --- source/features/search/ui/SearchBar.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/features/search/ui/SearchBar.tsx b/source/features/search/ui/SearchBar.tsx index 948ca600..db867d6e 100644 --- a/source/features/search/ui/SearchBar.tsx +++ b/source/features/search/ui/SearchBar.tsx @@ -21,7 +21,11 @@ export const SearchBar = (props: ISearchBarProps) => { const networkInfo = useNetworkInfoFeature().store; const introspectQuery = (query: string, type?: string) => { const typeOfSearch = type ? type : searchType; - if (query?.length === 64) { + if (query.substring(0, 4) === 'addr' || query.substring(0, 5) === 'stake') { + search.actions.addressSearchRequested.trigger({ + address: query, + }); + } else if (query?.length === 64) { search.actions.idSearchRequested.trigger({ id: query }); } else if (/^\d+$/.test(query)) { const searchNumber = parseInt(query, 10); @@ -42,6 +46,7 @@ export const SearchBar = (props: ISearchBarProps) => { } } } else { + // Byron-era addresses have no prefix or standard length search.actions.addressSearchRequested.trigger({ address: query, }); From a4db748ecbba032b0113f50c57f934f2e003d441 Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Thu, 12 Nov 2020 22:30:40 +1100 Subject: [PATCH 13/13] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff7baa0b..52b8f798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Compatibility upgrade ### Fixes - scope withdrawals query to address ([cad9e3f](https://github.com/input-output-hk/cardano-explorer-app/commit/cad9e3f48948cbe6bfb6f6adb795a6bc06fde2fb)) +- check search strings for shelley-era addresses, to avoid clash with testnet stake addresses and hashes ([58c004a](https://github.com/input-output-hk/cardano-explorer-app/commit/58c004a4422c01aef320802bb780361a93334a27)) ## 1.2.0