Skip to content

Commit

Permalink
refactor(experimental): graphql: group schema type resolvers
Browse files Browse the repository at this point in the history
  • Loading branch information
buffalojoec committed Jun 13, 2024
1 parent e1b1fde commit 7b2bf6c
Show file tree
Hide file tree
Showing 13 changed files with 213 additions and 373 deletions.
4 changes: 2 additions & 2 deletions packages/rpc-graphql/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { makeExecutableSchema } from '@graphql-tools/schema';
import { graphql } from 'graphql';

import { createSolanaGraphQLContext } from './context';
import { createSolanaGraphQLResolvers } from './resolvers';
import { createSolanaGraphQLTypeDefs } from './schema/type-defs';
import { createSolanaGraphQLTypeResolvers } from './schema/type-resolvers';

export interface RpcGraphQL {
query(
Expand All @@ -21,7 +21,7 @@ export function createRpcGraphQL(
maxMultipleAccountsBatchSize: config?.maxMultipleAccountsBatchSize ?? 100,
};
const schema = makeExecutableSchema({
resolvers: createSolanaGraphQLResolvers(),
resolvers: createSolanaGraphQLTypeResolvers(),
typeDefs: createSolanaGraphQLTypeDefs(),
});
return {
Expand Down
319 changes: 1 addition & 318 deletions packages/rpc-graphql/src/resolvers/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export type AccountResult = Partial<Omit<AccountLoaderValue, 'data'>> & {
ownerProgram?: Address;
};

const resolveAccountData = () => {
export const resolveAccountData = () => {
return (
parent: AccountResult | null,
args: {
Expand Down Expand Up @@ -124,320 +124,3 @@ export const resolveAccount = (fieldName?: string) => {
return null;
};
};

function resolveAccountType(accountResult: AccountResult) {
const { jsonParsedConfigs } = accountResult;
if (jsonParsedConfigs) {
if (jsonParsedConfigs.programName === 'nonce') {
return 'NonceAccount';
}
if (jsonParsedConfigs.programName === 'spl-token' || jsonParsedConfigs.programName === 'spl-token-2022') {
if (jsonParsedConfigs.accountType === 'mint') {
return 'MintAccount';
}
if (jsonParsedConfigs.accountType === 'account') {
return 'TokenAccount';
}
}
if (jsonParsedConfigs.programName === 'stake') {
return 'StakeAccount';
}
if (jsonParsedConfigs.accountType === 'vote' && jsonParsedConfigs.programName === 'vote') {
return 'VoteAccount';
}
if (
jsonParsedConfigs.accountType === 'lookupTable' &&
jsonParsedConfigs.programName === 'address-lookup-table'
) {
return 'LookupTableAccount';
}
if (jsonParsedConfigs.programName === 'sysvar') {
if (jsonParsedConfigs.accountType === 'clock') {
return 'SysvarClockAccount';
}
if (jsonParsedConfigs.accountType === 'epochRewards') {
return 'SysvarEpochRewardsAccount';
}
if (jsonParsedConfigs.accountType === 'epochSchedule') {
return 'SysvarEpochScheduleAccount';
}
if (jsonParsedConfigs.accountType === 'fees') {
return 'SysvarFeesAccount';
}
if (jsonParsedConfigs.accountType === 'lastRestartSlot') {
return 'SysvarLastRestartSlotAccount';
}
if (jsonParsedConfigs.accountType === 'recentBlockhashes') {
return 'SysvarRecentBlockhashesAccount';
}
if (jsonParsedConfigs.accountType === 'rent') {
return 'SysvarRentAccount';
}
if (jsonParsedConfigs.accountType === 'slotHashes') {
return 'SysvarSlotHashesAccount';
}
if (jsonParsedConfigs.accountType === 'slotHistory') {
return 'SysvarSlotHistoryAccount';
}
if (jsonParsedConfigs.accountType === 'stakeHistory') {
return 'SysvarStakeHistoryAccount';
}
}
}
return 'GenericAccount';
}

type Token2022ExtensionResult = {
extension: string;
state: object;
};

const resolveTokenExtensions = () => {
return (parent: (AccountResult & { extensions?: Token2022ExtensionResult[] }) | null) => {
if (parent != null && parent.extensions != undefined) {
return parent.extensions.map(e => {
const { extension, state } = e;
return {
extension,
...state,
};
});
}
return null;
};
};

const resolveAdditionalTokenMetadata = () => {
return (parent: { additionalMetadata?: [string, string][] }) => {
if (parent.additionalMetadata != undefined) {
return parent.additionalMetadata.map(([key, value]) => {
return {
key,
value,
};
});
}
return null;
};
};

function resolveTokenExtensionType(extensionResult: Token2022ExtensionResult) {
if (extensionResult.extension === 'confidentialTransferFeeConfig') {
return 'SplTokenExtensionConfidentialTransferFeeConfig';
}
if (extensionResult.extension === 'confidentialTransferMint') {
return 'SplTokenExtensionConfidentialTransferMint';
}
if (extensionResult.extension === 'defaultAccountState') {
return 'SplTokenExtensionDefaultAccountState';
}
if (extensionResult.extension === 'groupPointer') {
return 'SplTokenExtensionGroupPointer';
}
if (extensionResult.extension === 'groupMemberPointer') {
return 'SplTokenExtensionGroupMemberPointer';
}
if (extensionResult.extension === 'interestBearingConfig') {
return 'SplTokenExtensionInterestBearingConfig';
}
if (extensionResult.extension === 'metadataPointer') {
return 'SplTokenExtensionMetadataPointer';
}
if (extensionResult.extension === 'mintCloseAuthority') {
return 'SplTokenExtensionMintCloseAuthority';
}
if (extensionResult.extension === 'nonTransferable') {
return 'SplTokenExtensionNonTransferable';
}
if (extensionResult.extension === 'permanentDelegate') {
return 'SplTokenExtensionPermanentDelegate';
}
if (extensionResult.extension === 'tokenGroup') {
return 'SplTokenExtensionTokenGroup';
}
if (extensionResult.extension === 'tokenGroupMember') {
return 'SplTokenExtensionTokenGroupMember';
}
if (extensionResult.extension === 'tokenMetadata') {
return 'SplTokenExtensionTokenMetadata';
}
if (extensionResult.extension === 'transferFeeConfig') {
return 'SplTokenExtensionTransferFeeConfig';
}
if (extensionResult.extension === 'transferHook') {
return 'SplTokenExtensionTransferHook';
}
if (extensionResult.extension === 'confidentialTransferAccount') {
return 'SplTokenExtensionConfidentialTransferAccount';
}
if (extensionResult.extension === 'transferFeeAmount') {
return 'SplTokenExtensionTransferFeeAmount';
}
if (extensionResult.extension === 'transferHookAccount') {
return 'SplTokenExtensionTransferHookAccount';
}
if (extensionResult.extension === 'confidentialTransferFeeAmount') {
return 'SplTokenExtensionConfidentialTransferFeeAmount';
}
if (extensionResult.extension === 'nonTransferableAccount') {
return 'SplTokenExtensionNonTransferableAccount';
}
if (extensionResult.extension === 'immutableOwner') {
return 'SplTokenExtensionImmutableOwner';
}
if (extensionResult.extension === 'memoTransfer') {
return 'SplTokenExtensionMemoTransfer';
}
if (extensionResult.extension === 'cpiGuard') {
return 'SplTokenExtensionCpiGuard';
}
}

export const accountResolvers = {
Account: {
__resolveType: resolveAccountType,
data: resolveAccountData(),
},
GenericAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
LookupTableAccount: {
authority: resolveAccount('authority'),
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
MintAccount: {
data: resolveAccountData(),
extensions: resolveTokenExtensions(),
freezeAuthority: resolveAccount('freezeAuthority'),
mintAuthority: resolveAccount('mintAuthority'),
ownerProgram: resolveAccount('ownerProgram'),
},
NonceAccount: {
authority: resolveAccount('authority'),
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SplTokenExtension: {
__resolveType: resolveTokenExtensionType,
},
SplTokenExtensionConfidentialTransferFeeConfig: {
authority: resolveAccount('authority'),
},
SplTokenExtensionConfidentialTransferMint: {
authority: resolveAccount('authority'),
},
SplTokenExtensionGroupMemberPointer: {
authority: resolveAccount('authority'),
memberAddress: resolveAccount('memberAddress'),
},
SplTokenExtensionGroupPointer: {
authority: resolveAccount('authority'),
groupAddress: resolveAccount('groupAddress'),
},
SplTokenExtensionInterestBearingConfig: {
rateAuthority: resolveAccount('rateAuthority'),
},
SplTokenExtensionMetadataPointer: {
authority: resolveAccount('authority'),
metadataAddress: resolveAccount('metadataAddress'),
},
SplTokenExtensionMintCloseAuthority: {
closeAuthority: resolveAccount('closeAuthority'),
},
SplTokenExtensionPermanentDelegate: {
delegate: resolveAccount('delegate'),
},
SplTokenExtensionTokenGroup: {
mint: resolveAccount('mint'),
updateAuthority: resolveAccount('updateAuthority'),
},
SplTokenExtensionTokenGroupMember: {
group: resolveAccount('group'),
mint: resolveAccount('mint'),
},
SplTokenExtensionTokenMetadata: {
additionalMetadata: resolveAdditionalTokenMetadata(),
mint: resolveAccount('mint'),
updateAuthority: resolveAccount('updateAuthority'),
},
SplTokenExtensionTransferFeeConfig: {
transferFeeConfigAuthority: resolveAccount('transferFeeConfigAuthority'),
withdrawWithheldAuthority: resolveAccount('withdrawWithheldAuthority'),
},
SplTokenExtensionTransferHook: {
authority: resolveAccount('authority'),
hookProgramId: resolveAccount('programId'),
},
StakeAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
StakeAccountDataMetaAuthorized: {
staker: resolveAccount('staker'),
withdrawer: resolveAccount('withdrawer'),
},
StakeAccountDataMetaLockup: {
custodian: resolveAccount('custodian'),
},
StakeAccountDataStakeDelegation: {
voter: resolveAccount('voter'),
},
SysvarClockAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarEpochRewardsAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarEpochScheduleAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarFeesAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarLastRestartSlotAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarRecentBlockhashesAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarRentAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarSlotHashesAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarSlotHistoryAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
SysvarStakeHistoryAccount: {
data: resolveAccountData(),
ownerProgram: resolveAccount('ownerProgram'),
},
TokenAccount: {
data: resolveAccountData(),
extensions: resolveTokenExtensions(),
mint: resolveAccount('mint'),
owner: resolveAccount('owner'),
ownerProgram: resolveAccount('ownerProgram'),
},
VoteAccount: {
authorizedWithdrawer: resolveAccount('authorizedWithdrawer'),
data: resolveAccountData(),
node: resolveAccount('nodePubkey'),
ownerProgram: resolveAccount('ownerProgram'),
},
VoteAccountDataAuthorizedVoter: {
authorizedVoter: resolveAccount('authorizedVoter'),
},
};
9 changes: 1 addition & 8 deletions packages/rpc-graphql/src/resolvers/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { BlockLoaderValue, cacheKeyFn } from '../loaders';
import { buildBlockLoaderArgSetFromResolveInfo, onlyFieldsRequested } from './resolve-info';
import { mapJsonParsedInnerInstructions, mapJsonParsedInstructions, TransactionResult } from './transaction';

type BlockResult = Partial<BlockLoaderValue> & {
export type BlockResult = Partial<BlockLoaderValue> & {
slot: Slot;
transactionResults?: { [i: number]: TransactionResult };
};
Expand Down Expand Up @@ -116,10 +116,3 @@ export const resolveBlock = (fieldName?: string) => {
return null;
};
};

export const blockResolvers = {
Block: {
transactions: (parent?: BlockResult) =>
parent?.transactionResults ? Object.values(parent.transactionResults) : null,
},
};
19 changes: 0 additions & 19 deletions packages/rpc-graphql/src/resolvers/index.ts

This file was deleted.

Loading

0 comments on commit 7b2bf6c

Please sign in to comment.