From c790c9bff09519845e51561cf00174b3c973a2ab Mon Sep 17 00:00:00 2001 From: maria Date: Mon, 12 Feb 2024 18:57:10 +0000 Subject: [PATCH] Address comments --- src/api/getHarvestParams.ts | 18 +++++------------- src/api/rewardsHistory.ts | 20 ++++++-------------- src/api/transactionsHistory.ts | 18 ++++++------------ src/api/vaultDetails.ts | 18 ++++-------------- src/internal/connector.ts | 21 ++++++++++++++++++--- src/internal/osTokenRequests.ts | 22 ++++++---------------- 6 files changed, 45 insertions(+), 72 deletions(-) diff --git a/src/api/getHarvestParams.ts b/src/api/getHarvestParams.ts index 7798cde..6f92346 100644 --- a/src/api/getHarvestParams.ts +++ b/src/api/getHarvestParams.ts @@ -3,7 +3,7 @@ import { StakewiseConnector } from '../internal/connector'; export const getHarvestParams = async (connector: StakewiseConnector, vault: Hex) => { try { - const harvestResponse = await connector.graphqlRequest({ + const harvestData = await connector.graphqlRequest({ type: 'graph', op: 'HarvestParams', query: ` @@ -19,22 +19,14 @@ export const getHarvestParams = async (connector: StakewiseConnector, vault: Hex variables: { address: vault.toLowerCase(), }, - onSuccess: function (value: Response) { - return value; - }, + onSuccess: (value: { data: any }) => value, onError: function (reason: any): PromiseLike { throw new Error(`Failed to get harvest from Stakewise: ${reason}`); }, }); - if (!harvestResponse.ok) { - throw new Error('Invalid response from Stakewise'); - } - const harvestData = await harvestResponse.json(); - if (harvestData.errors && harvestData.errors.length) { - throw new Error(harvestData.errors[0].message); - } - if (!harvestData.data || !harvestData.data.harvestParams) { - throw new Error('Vault data is missing or incomplete'); + + if (!harvestData.data.harvestParams) { + throw new Error('Vault data is missing the harvestParams field'); } return harvestData.data.harvestParams; } catch (error) { diff --git a/src/api/rewardsHistory.ts b/src/api/rewardsHistory.ts index 26da9a4..b3476e9 100644 --- a/src/api/rewardsHistory.ts +++ b/src/api/rewardsHistory.ts @@ -16,30 +16,22 @@ async function extractVaultUserRewards( dateFrom: Math.floor(dateFrom.getTime() / 1000).toString(), }; try { - const responseRewards = await connector.graphqlRequest({ + const rewardsData = await connector.graphqlRequest({ type: 'api', op: 'UserRewards', query: `query UserRewards($user: String!, $vaultAddress: String!, $dateFrom: DateAsTimestamp!) { userRewards(user: $user, vaultAddress: $vaultAddress, dateFrom: $dateFrom) { date, sumRewards, }}`, variables: vars_getRewards, - onSuccess: function (value: Response): Response { - return value; - }, + onSuccess: (value: { data: any }) => value, // eslint-disable-next-line @typescript-eslint/no-explicit-any onError: function (reason: any): PromiseLike { throw new Error(`Failed to get rewards from Stakewise: ${reason}`); }, }); - if (!responseRewards.ok) { - throw new Error('Invalid response from Stakewise'); - } - const rewardsData = await responseRewards.json(); - - if (rewardsData.errors && rewardsData.errors.length) { - throw new Error(rewardsData.errors[0].message); - } - if (!rewardsData.data || !rewardsData.data.userRewards || rewardsData.data.userRewards.length === 0) { - throw new Error('Rewards data is missing or incomplete'); + if (!rewardsData.data.userRewards || rewardsData.data.userRewards.length === 0) { + throw new Error( + `Rewards data is missing the userRewards field or the field is empty ${rewardsData.data.userRewards}`, + ); } const dataPoints: RewardsDataPoint[] = []; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/api/transactionsHistory.ts b/src/api/transactionsHistory.ts index 14aaf3b..268c40b 100644 --- a/src/api/transactionsHistory.ts +++ b/src/api/transactionsHistory.ts @@ -19,7 +19,7 @@ async function extractTransactionsHistory( skip: 0, }; try { - const responseActions = await connector.graphqlRequest({ + const actionsData = await connector.graphqlRequest({ type: 'graph', op: 'AllocatorActions', query: ` @@ -29,23 +29,17 @@ async function extractTransactionsHistory( { id assets createdAt actionType }} `, variables: vars_getActions, - onSuccess: function (value: Response): Response { - return value; - }, + onSuccess: (value: { data: any }) => value, // eslint-disable-next-line @typescript-eslint/no-explicit-any onError: function (reason: any): PromiseLike { throw new Error(`Failed to get vault from Stakewise: ${reason}`); }, }); - const actionsData = await responseActions.json(); - - if (actionsData.errors && actionsData.errors.length) { - throw new Error(actionsData.errors[0].message); - } - - if (!actionsData.data || !actionsData.data.allocatorActions || actionsData.data.allocatorActions.length === 0) { - throw new Error('Transaction data is missing or incomplete'); + if (!actionsData.data.allocatorActions || actionsData.data.allocatorActions.length === 0) { + throw new Error( + `Transaction data is missing the allocatorActions field or the field is empty ${actionsData.data.allocatorActions}`, + ); } const interactions: VaultTransaction[] = []; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/api/vaultDetails.ts b/src/api/vaultDetails.ts index d689e30..11b88e9 100644 --- a/src/api/vaultDetails.ts +++ b/src/api/vaultDetails.ts @@ -25,7 +25,7 @@ async function extractVaultProperties(connector: StakewiseConnector, vault: Hex) today.setDate(today.getDate()); try { - const responseVault = await connector.graphqlRequest({ + const vaultData = await connector.graphqlRequest({ type: 'graph', op: 'Vault', query: ` @@ -61,25 +61,15 @@ async function extractVaultProperties(connector: StakewiseConnector, vault: Hex) } }`, variables: vars_getVault, - onSuccess: function (value: Response): Response { - return value; - }, + onSuccess: (value: { data: any }) => value, // eslint-disable-next-line @typescript-eslint/no-explicit-any onError: function (reason: any): PromiseLike { throw new Error(`Failed to get vault from Stakewise: ${reason}`); }, }); - if (!responseVault.ok) { - throw new Error('Invalid response from Stakewise'); - } - const vaultData = await responseVault.json(); - - if (vaultData.errors && vaultData.errors.length > 0) { - throw new Error(vaultData.errors[0].message); - } - if (!vaultData.data || !vaultData.data.vault) { - throw new Error('Vault data is missing or incomplete'); + if (!vaultData.data.vault) { + throw new Error(`Vault data is missing the vault field ${vaultData.data}`); } return { vaultData: vaultData.data }; } catch (error) { diff --git a/src/internal/connector.ts b/src/internal/connector.ts index 05c928c..70bf38f 100644 --- a/src/internal/connector.ts +++ b/src/internal/connector.ts @@ -9,7 +9,7 @@ export interface GraphQLRequest { query: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any variables: any; - onSuccess: (value: Response) => Response; + onSuccess: (value: { data: any }) => { data: any }; // eslint-disable-next-line @typescript-eslint/no-explicit-any onError: (reason: any) => PromiseLike; } @@ -95,7 +95,7 @@ export class StakewiseConnector { } // Perform graphQL request - graphqlRequest = (request: GraphQLRequest): Promise => { + graphqlRequest = (request: GraphQLRequest): Promise<{ data: any }> => { const body: string = JSON.stringify({ operationName: request.op, query: request.query.trim(), @@ -123,6 +123,21 @@ export class StakewiseConnector { } const endpoint = `${uri}?opName=${request.op}`; - return fetch(endpoint, params).then(request.onSuccess).catch(request.onError); + return fetch(endpoint, params) + .then(async (response) => { + if (!response.ok) { + throw new Error('Invalid response from Stakewise'); + } + const responseData = await response.json(); + + if (responseData.errors && responseData.errors.length) { + throw new Error(responseData.errors[0].message); + } + if (!responseData.data) { + throw new Error('Response from Stakewise is missing data'); + } + return request.onSuccess(responseData); + }) + .catch(request.onError); }; } diff --git a/src/internal/osTokenRequests.ts b/src/internal/osTokenRequests.ts index 17ea0d6..dcc452c 100644 --- a/src/internal/osTokenRequests.ts +++ b/src/internal/osTokenRequests.ts @@ -136,7 +136,7 @@ export const getStakeBalance = async (pool: OpusPool, vaultAddress: Hex): Promis export const getOsTokenPosition = async (pool: OpusPool, vaultAddress: Hex): Promise => { try { - const gqlMintedSharesResult = await pool.connector.graphqlRequest({ + const gqlMintedSharesJson = await pool.connector.graphqlRequest({ op: 'OsTokenPositions', type: 'graph', query: ` @@ -146,24 +146,14 @@ export const getOsTokenPosition = async (pool: OpusPool, vaultAddress: Hex): Pro vaultAddress, address: pool.userAccount, }, - onSuccess: (value: Response) => value, + onSuccess: (value: { data: any }) => value, onError: (reason: any) => Promise.reject(reason), }); - if (!gqlMintedSharesResult.ok) { - throw new Error('Invalid response from Stakewise'); - } - const gqlMintedSharesJson = await gqlMintedSharesResult.json(); - - if (gqlMintedSharesJson.errors && gqlMintedSharesJson.errors.length) { - throw new Error(gqlMintedSharesJson.errors[0].message); - } - if ( - !gqlMintedSharesJson.data || - !gqlMintedSharesJson.data.osTokenPositions || - gqlMintedSharesJson.data.osTokenPositions.length === 0 - ) { - throw new Error('Minted shares data is incomplete'); + if (!gqlMintedSharesJson.data.osTokenPositions || gqlMintedSharesJson.data.osTokenPositions.length === 0) { + throw new Error( + `Minted shares data is missing the osTokenPositions field or the field is empty ${gqlMintedSharesJson.data.osTokenPositions}`, + ); } const gqlMintedShares = BigInt(gqlMintedSharesJson.data.osTokenPositions[0]?.shares || 0);