From 3d36a96aedb8b828b2d172e647fd7612259351bf Mon Sep 17 00:00:00 2001 From: Rodrigo Branas Date: Tue, 24 Sep 2024 17:44:13 -0300 Subject: [PATCH] resolving verified assets --- .../graphql/src/graphql/generated/mocks.ts | 25 ++++++++++- .../src/graphql/generated/sdk-provider.ts | 21 ++++++++++ packages/graphql/src/graphql/generated/sdk.ts | 25 ++++++++++- .../src/graphql/queries/sdk/asset.graphql | 2 + .../src/graphql/resolvers/PublicResolver.ts | 41 ++++++++++++++++++- .../src/graphql/schemas/explorer.graphql | 21 ++++++++++ 6 files changed, 132 insertions(+), 3 deletions(-) diff --git a/packages/graphql/src/graphql/generated/mocks.ts b/packages/graphql/src/graphql/generated/mocks.ts index 7f751316..21813f69 100644 --- a/packages/graphql/src/graphql/generated/mocks.ts +++ b/packages/graphql/src/graphql/generated/mocks.ts @@ -1,4 +1,4 @@ -import type { GQLAsset, GQLBalance, GQLBalanceConnection, GQLBalanceEdge, GQLBalanceFilterInput, GQLBlock, GQLBlockConnection, GQLBlockEdge, GQLBlocksDashboard, GQLBlocksDashboardConnection, GQLBreakpoint, GQLChainInfo, GQLChangeOutput, GQLCoin, GQLCoinConnection, GQLCoinEdge, GQLCoinFilterInput, GQLCoinOutput, GQLConsensusParameters, GQLConsensusParametersPurpose, GQLContract, GQLContractBalance, GQLContractBalanceConnection, GQLContractBalanceEdge, GQLContractBalanceFilterInput, GQLContractConnection, GQLContractCreated, GQLContractOutput, GQLContractParameters, GQLDryRunFailureStatus, GQLDryRunSuccessStatus, GQLDryRunTransactionExecutionStatus, GQLEstimateGasPrice, GQLExcludeInput, GQLFailureStatus, GQLFeeParameters, GQLGasCosts, GQLGenesis, GQLGroupedInputCoin, GQLGroupedInputContract, GQLGroupedInputMessage, GQLGroupedOutputChanged, GQLGroupedOutputCoin, GQLGroupedOutputContractCreated, GQLHeader, GQLHeavyOperation, GQLInputCoin, GQLInputContract, GQLInputMessage, GQLLatestGasPrice, GQLLightOperation, GQLMerkleProof, GQLMessage, GQLMessageCoin, GQLMessageConnection, GQLMessageEdge, GQLMessageProof, GQLMessageStatus, GQLMutation, GQLNodeInfo, GQLOperation, GQLOperationReceipt, GQLOperationsFilterInput, GQLOutputBreakpoint, GQLPageInfo, GQLParsedTime, GQLPeerInfo, GQLPoAConsensus, GQLPolicies, GQLPredicateItem, GQLPredicateParameters, GQLProgramState, GQLQuery, GQLReceipt, GQLRelayedTransactionFailed, GQLRunResult, GQLScriptParameters, GQLSearchAccount, GQLSearchBlock, GQLSearchContract, GQLSearchResult, GQLSearchTransaction, GQLSpendQueryElementInput, GQLSqueezedOutStatus, GQLStateTransitionPurpose, GQLSubmittedStatus, GQLSubscription, GQLSuccessStatus, GQLTps, GQLTpsConnection, GQLTransaction, GQLTransactionConnection, GQLTransactionEdge, GQLTransactionGasCosts, GQLTxParameters, GQLUtxoItem, GQLVariableOutput, GQLBlockVersion, GQLConsensusParametersVersion, GQLContractParametersVersion, GQLFeeParametersVersion, GQLGasCostsVersion, GQLGroupedInputType, GQLGroupedOutputType, GQLHeaderVersion, GQLMessageState, GQLOperationType, GQLPredicateParametersVersion, GQLReceiptType, GQLReturnType, GQLRunState, GQLScriptParametersVersion, GQLTxParametersVersion } from './sdk'; +import type { GQLAsset, GQLAssetNetworkEthereum, GQLAssetNetworkFuel, GQLBalance, GQLBalanceConnection, GQLBalanceEdge, GQLBalanceFilterInput, GQLBlock, GQLBlockConnection, GQLBlockEdge, GQLBlocksDashboard, GQLBlocksDashboardConnection, GQLBreakpoint, GQLChainInfo, GQLChangeOutput, GQLCoin, GQLCoinConnection, GQLCoinEdge, GQLCoinFilterInput, GQLCoinOutput, GQLConsensusParameters, GQLConsensusParametersPurpose, GQLContract, GQLContractBalance, GQLContractBalanceConnection, GQLContractBalanceEdge, GQLContractBalanceFilterInput, GQLContractConnection, GQLContractCreated, GQLContractOutput, GQLContractParameters, GQLDryRunFailureStatus, GQLDryRunSuccessStatus, GQLDryRunTransactionExecutionStatus, GQLEstimateGasPrice, GQLExcludeInput, GQLFailureStatus, GQLFeeParameters, GQLGasCosts, GQLGenesis, GQLGroupedInputCoin, GQLGroupedInputContract, GQLGroupedInputMessage, GQLGroupedOutputChanged, GQLGroupedOutputCoin, GQLGroupedOutputContractCreated, GQLHeader, GQLHeavyOperation, GQLInputCoin, GQLInputContract, GQLInputMessage, GQLLatestGasPrice, GQLLightOperation, GQLMerkleProof, GQLMessage, GQLMessageCoin, GQLMessageConnection, GQLMessageEdge, GQLMessageProof, GQLMessageStatus, GQLMutation, GQLNodeInfo, GQLOperation, GQLOperationReceipt, GQLOperationsFilterInput, GQLOutputBreakpoint, GQLPageInfo, GQLParsedTime, GQLPeerInfo, GQLPoAConsensus, GQLPolicies, GQLPredicateItem, GQLPredicateParameters, GQLProgramState, GQLQuery, GQLReceipt, GQLRelayedTransactionFailed, GQLRunResult, GQLScriptParameters, GQLSearchAccount, GQLSearchBlock, GQLSearchContract, GQLSearchResult, GQLSearchTransaction, GQLSpendQueryElementInput, GQLSqueezedOutStatus, GQLStateTransitionPurpose, GQLSubmittedStatus, GQLSubscription, GQLSuccessStatus, GQLTps, GQLTpsConnection, GQLTransaction, GQLTransactionConnection, GQLTransactionEdge, GQLTransactionGasCosts, GQLTxParameters, GQLUtxoItem, GQLVariableOutput, GQLBlockVersion, GQLConsensusParametersVersion, GQLContractParametersVersion, GQLFeeParametersVersion, GQLGasCostsVersion, GQLGroupedInputType, GQLGroupedOutputType, GQLHeaderVersion, GQLMessageState, GQLOperationType, GQLPredicateParametersVersion, GQLReceiptType, GQLReturnType, GQLRunState, GQLScriptParametersVersion, GQLTxParametersVersion } from './sdk'; export const anAsset = (overrides?: Partial): { __typename: 'Asset' } & GQLAsset => { return { @@ -6,8 +6,31 @@ export const anAsset = (overrides?: Partial): { __typename: 'Asset' } assetId: overrides && overrides.hasOwnProperty('assetId') ? overrides.assetId! : 'laboriosam', contractId: overrides && overrides.hasOwnProperty('contractId') ? overrides.contractId! : 'corrupti', decimals: overrides && overrides.hasOwnProperty('decimals') ? overrides.decimals! : '0x4', + icon: overrides && overrides.hasOwnProperty('icon') ? overrides.icon! : 'explicabo', name: overrides && overrides.hasOwnProperty('name') ? overrides.name! : 'dolorem', + networks: overrides && overrides.hasOwnProperty('networks') ? overrides.networks! : [anAssetNetworkEthereum()], symbol: overrides && overrides.hasOwnProperty('symbol') ? overrides.symbol! : 'quaerat', + verified: overrides && overrides.hasOwnProperty('verified') ? overrides.verified! : false, + }; +}; + +export const anAssetNetworkEthereum = (overrides?: Partial): { __typename: 'AssetNetworkEthereum' } & GQLAssetNetworkEthereum => { + return { + __typename: 'AssetNetworkEthereum', + address: overrides && overrides.hasOwnProperty('address') ? overrides.address! : 'porro', + decimals: overrides && overrides.hasOwnProperty('decimals') ? overrides.decimals! : '0xf', + type: overrides && overrides.hasOwnProperty('type') ? overrides.type! : 'commodi', + }; +}; + +export const anAssetNetworkFuel = (overrides?: Partial): { __typename: 'AssetNetworkFuel' } & GQLAssetNetworkFuel => { + return { + __typename: 'AssetNetworkFuel', + assetId: overrides && overrides.hasOwnProperty('assetId') ? overrides.assetId! : 'placeat', + chainId: overrides && overrides.hasOwnProperty('chainId') ? overrides.chainId! : '0x8', + contractId: overrides && overrides.hasOwnProperty('contractId') ? overrides.contractId! : 'maiores', + decimals: overrides && overrides.hasOwnProperty('decimals') ? overrides.decimals! : '0x2', + type: overrides && overrides.hasOwnProperty('type') ? overrides.type! : 'minima', }; }; diff --git a/packages/graphql/src/graphql/generated/sdk-provider.ts b/packages/graphql/src/graphql/generated/sdk-provider.ts index 8c926a21..c6e5e4bf 100644 --- a/packages/graphql/src/graphql/generated/sdk-provider.ts +++ b/packages/graphql/src/graphql/generated/sdk-provider.ts @@ -40,8 +40,29 @@ export type GQLAsset = { assetId?: Maybe; contractId?: Maybe; decimals?: Maybe; + icon?: Maybe; name?: Maybe; + networks?: Maybe>>; symbol?: Maybe; + verified?: Maybe; +}; + +export type GQLAssetNetwork = GQLAssetNetworkEthereum | GQLAssetNetworkFuel; + +export type GQLAssetNetworkEthereum = { + __typename: 'AssetNetworkEthereum'; + address?: Maybe; + decimals?: Maybe; + type?: Maybe; +}; + +export type GQLAssetNetworkFuel = { + __typename: 'AssetNetworkFuel'; + assetId?: Maybe; + chainId?: Maybe; + contractId?: Maybe; + decimals?: Maybe; + type?: Maybe; }; export type GQLBalance = { diff --git a/packages/graphql/src/graphql/generated/sdk.ts b/packages/graphql/src/graphql/generated/sdk.ts index 729f38d8..50b7cda1 100644 --- a/packages/graphql/src/graphql/generated/sdk.ts +++ b/packages/graphql/src/graphql/generated/sdk.ts @@ -40,8 +40,29 @@ export type GQLAsset = { assetId?: Maybe; contractId?: Maybe; decimals?: Maybe; + icon?: Maybe; name?: Maybe; + networks?: Maybe>>; symbol?: Maybe; + verified?: Maybe; +}; + +export type GQLAssetNetwork = GQLAssetNetworkEthereum | GQLAssetNetworkFuel; + +export type GQLAssetNetworkEthereum = { + __typename: 'AssetNetworkEthereum'; + address?: Maybe; + decimals?: Maybe; + type?: Maybe; +}; + +export type GQLAssetNetworkFuel = { + __typename: 'AssetNetworkFuel'; + assetId?: Maybe; + chainId?: Maybe; + contractId?: Maybe; + decimals?: Maybe; + type?: Maybe; }; export type GQLBalance = { @@ -1487,7 +1508,7 @@ export type GQLAssetQueryVariables = Exact<{ }>; -export type GQLAssetQuery = { __typename: 'Query', asset?: { __typename: 'Asset', assetId?: string | null, contractId?: string | null, name?: string | null, symbol?: string | null, decimals?: string | null } | null }; +export type GQLAssetQuery = { __typename: 'Query', asset?: { __typename: 'Asset', assetId?: string | null, contractId?: string | null, name?: string | null, symbol?: string | null, decimals?: string | null, icon?: string | null, verified?: boolean | null } | null }; export type GQLBalanceItemFragment = { __typename: 'Balance', amount: string, assetId: string, owner: string, utxos?: Array<{ __typename: 'UtxoItem', amount: string, blockCreated?: string | null, txCreatedIdx?: string | null, utxoId: string } | null> | null }; @@ -2091,6 +2112,8 @@ export const AssetDocument = gql` name symbol decimals + icon + verified } } `; diff --git a/packages/graphql/src/graphql/queries/sdk/asset.graphql b/packages/graphql/src/graphql/queries/sdk/asset.graphql index bcafbec1..d75d17c1 100644 --- a/packages/graphql/src/graphql/queries/sdk/asset.graphql +++ b/packages/graphql/src/graphql/queries/sdk/asset.graphql @@ -5,5 +5,7 @@ query asset($assetId: String!){ name symbol decimals + icon + verified } } diff --git a/packages/graphql/src/graphql/resolvers/PublicResolver.ts b/packages/graphql/src/graphql/resolvers/PublicResolver.ts index 36d91cd3..31d315ed 100644 --- a/packages/graphql/src/graphql/resolvers/PublicResolver.ts +++ b/packages/graphql/src/graphql/resolvers/PublicResolver.ts @@ -1,3 +1,5 @@ +import { Provider } from 'fuels'; +import { env } from '~/config'; import type { GQLAsset } from '~/graphql/generated/sdk-provider'; import AssetDAO from '~/infra/dao/AssetDAO'; @@ -18,6 +20,43 @@ export class PublicResolver { async asset(_: Source, _params: Params['asset']) { const assetDAO = new AssetDAO(); - return assetDAO.getByAssetId(_params.assetId); + const provider = await Provider.create(env.get('FUEL_PROVIDER')); + const chainId = provider.getChainId(); + const response = await fetch( + 'https://verified-assets.fuel.network/assets.json', + ); + const verifiedAssets = await response.json(); + for (const verifiedAsset of verifiedAssets) { + for (const network of verifiedAsset.networks) { + if (network.type === 'fuel') { + network.__typename = 'AssetNetworkFuel'; + } + if (network.type === 'ethereum') { + network.__typename = 'AssetNetworkEthereum'; + } + } + } + for (const verifiedAsset of verifiedAssets) { + for (const network of verifiedAsset.networks) { + if ( + network.chainId === chainId && + network.assetId === _params.assetId + ) { + console.log(verifiedAsset); + const asset = Object.assign(verifiedAsset, { + assetId: _params.assetId, + contractId: network.contractId, + decimals: network.decimals, + verified: true, + }); + return asset; + } + } + } + const asset = await assetDAO.getByAssetId(_params.assetId); + if (!asset) return; + return Object.assign(asset, { + verified: false, + }); } } diff --git a/packages/graphql/src/graphql/schemas/explorer.graphql b/packages/graphql/src/graphql/schemas/explorer.graphql index dde0673a..07de5c6c 100644 --- a/packages/graphql/src/graphql/schemas/explorer.graphql +++ b/packages/graphql/src/graphql/schemas/explorer.graphql @@ -256,4 +256,25 @@ type Asset { name: String symbol: String decimals: U64 + icon: String + verified: Boolean + networks: [AssetNetwork] +} + +union AssetNetwork = + | AssetNetworkFuel + | AssetNetworkEthereum + +type AssetNetworkFuel { + type: String + decimals: U64 + assetId: String + contractId: String + chainId: U64 +} + +type AssetNetworkEthereum { + type: String + decimals: U64 + address: String }