From 1c3a24a4afdd15278e09ba868bae73f4a61d1012 Mon Sep 17 00:00:00 2001 From: Joe C Date: Fri, 14 Jun 2024 08:12:27 -0500 Subject: [PATCH] refactor(experimental): graphql: token-2022 extensions: reallocate (#2811) --- .../rpc-graphql/src/__tests__/__setup__.ts | 35 +++++++- .../src/__tests__/transaction-tests.ts | 81 +++++++++++++++++++ .../src/schema/type-defs/instruction.ts | 14 ++++ .../rpc-graphql/src/schema/type-defs/types.ts | 28 +++++++ .../src/schema/type-resolvers/instruction.ts | 10 +++ .../src/schema/type-resolvers/types.ts | 27 +++++++ 6 files changed, 194 insertions(+), 1 deletion(-) diff --git a/packages/rpc-graphql/src/__tests__/__setup__.ts b/packages/rpc-graphql/src/__tests__/__setup__.ts index 4df1b803143..0a298288505 100644 --- a/packages/rpc-graphql/src/__tests__/__setup__.ts +++ b/packages/rpc-graphql/src/__tests__/__setup__.ts @@ -2713,7 +2713,40 @@ export const mockTransactionToken2022AllExtensions = { programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', stackHeight: null, }, - // TODO (more) ... + { + parsed: { + info: { + account: '6muXBR8kTs1UEbATDkFzEf61HPeEHrCvdBNciVoxic8d', + extensionTypes: ['transferFeeAmount', 'memoTransfer'], + owner: '2Pwe6Yahh5cbzvCwRMtTYFeboSwYiWeHhYJzZZBsU6eB', + payer: '2Pwe6Yahh5cbzvCwRMtTYFeboSwYiWeHhYJzZZBsU6eB', + systemProgram: '11111111111111111111111111111111', + }, + type: 'reallocate', + }, + program: 'spl-token', + programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', + stackHeight: null, + }, + { + parsed: { + info: { + account: '6muXBR8kTs1UEbATDkFzEf61HPeEHrCvdBNciVoxic8d', + extensionTypes: ['transferFeeAmount', 'memoTransfer'], + payer: '2Pwe6Yahh5cbzvCwRMtTYFeboSwYiWeHhYJzZZBsU6eB', + systemProgram: '11111111111111111111111111111111', + signers: [ + '2Pwe6Yahh5cbzvCwRMtTYFeboSwYiWeHhYJzZZBsU6eB', + '2Pwe6Yahh5cbzvCwRMtTYFeboSwYiWeHhYJzZZBsU6eB', + ], + multisigOwner: 'Sysvar1nstructions1111111111111111111111111', + }, + type: 'reallocate', + }, + program: 'spl-token', + programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', + stackHeight: null, + }, ], recentBlockhash: '6vRS7MoToVccMqfQecdVC6UbmARaT5mha91zhreqnce9', }, diff --git a/packages/rpc-graphql/src/__tests__/transaction-tests.ts b/packages/rpc-graphql/src/__tests__/transaction-tests.ts index 4f47ef4b0c4..a821f310f56 100644 --- a/packages/rpc-graphql/src/__tests__/transaction-tests.ts +++ b/packages/rpc-graphql/src/__tests__/transaction-tests.ts @@ -3791,6 +3791,87 @@ describe('transaction', () => { }, }); }); + + it('reallocate', async () => { + expect.assertions(1); + const source = /* GraphQL */ ` + query testQuery($signature: Signature!) { + transaction(signature: $signature) { + message { + instructions { + programId + ... on SplTokenReallocate { + account { + address + } + extensionTypes + owner { + address + } + payer { + address + } + systemProgram { + address + } + multisigOwner { + address + } + signers + } + } + } + } + } + `; + const result = await rpcGraphQL.query(source, { signature }); + expect(result).toMatchObject({ + data: { + transaction: { + message: { + instructions: expect.arrayContaining([ + { + account: { + address: expect.any(String), + }, + extensionTypes: expect.arrayContaining([expect.any(String)]), + multisigOwner: null, + owner: { + address: expect.any(String), + }, + payer: { + address: expect.any(String), + }, + programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', + signers: null, + systemProgram: { + address: expect.any(String), + }, + }, + { + account: { + address: expect.any(String), + }, + extensionTypes: expect.arrayContaining([expect.any(String)]), + multisigOwner: { + address: expect.any(String), + }, + owner: null, + payer: { + address: expect.any(String), + }, + programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', + signers: expect.arrayContaining([expect.any(String)]), + systemProgram: { + address: expect.any(String), + }, + }, + ]), + }, + }, + }, + }); + }); }); }); }); diff --git a/packages/rpc-graphql/src/schema/type-defs/instruction.ts b/packages/rpc-graphql/src/schema/type-defs/instruction.ts index 328946b6af8..20cb7473380 100644 --- a/packages/rpc-graphql/src/schema/type-defs/instruction.ts +++ b/packages/rpc-graphql/src/schema/type-defs/instruction.ts @@ -1014,6 +1014,20 @@ export const instructionTypeDefs = /* GraphQL */ ` withheldAmount: String } + """ + SplToken-2022: Reallocate instruction + """ + type SplTokenReallocate implements TransactionInstruction { + programId: Address + account: Account + extensionTypes: [SplTokenExtensionType] + owner: Account + multisigOwner: Account + payer: Account + signers: [Address] + systemProgram: Account + } + """ Spl Token Group: InitializeGroup instruction """ diff --git a/packages/rpc-graphql/src/schema/type-defs/types.ts b/packages/rpc-graphql/src/schema/type-defs/types.ts index 6f6f95a71cd..0f6adbbda17 100644 --- a/packages/rpc-graphql/src/schema/type-defs/types.ts +++ b/packages/rpc-graphql/src/schema/type-defs/types.ts @@ -67,6 +67,34 @@ export const typeTypeDefs = /* GraphQL */ ` UNINITIALIZED } + enum SplTokenExtensionType { + UNINITIALIZED + TRANSFER_FEE_CONFIG + TRANSFER_FEE_AMOUNT + MINT_CLOSE_AUTHORITY + CONFIDENTIAL_TRANSFER_MINT + CONFIDENTIAL_TRANSFER_ACCOUNT + DEFAULT_ACCOUNT_STATE + IMMUTABLE_OWNER + MEMO_TRANSFER + NON_TRANSFERABLE + INTEREST_BEARING_CONFIG + CPI_GUARD + PERMANENT_DELEGATE + NON_TRANSFERABLE_ACCOUNT + CONFIDENTIAL_TRANSFER_FEE_CONFIG + CONFIDENTIAL_TRANSFER_FEE_AMOUNT + TRANSFER_HOOK + TRANSFER_HOOK_ACCOUNT + METADATA_POINTER + TOKEN_METADATA + GROUP_POINTER + GROUP_MEMBER_POINTER + TOKEN_GROUP + TOKEN_GROUP_MEMBER + UNPARSEABLE_EXTENSION + } + type TokenAmount { amount: BigInt decimals: Int diff --git a/packages/rpc-graphql/src/schema/type-resolvers/instruction.ts b/packages/rpc-graphql/src/schema/type-resolvers/instruction.ts index a46a81030da..67b7dd7fc73 100644 --- a/packages/rpc-graphql/src/schema/type-resolvers/instruction.ts +++ b/packages/rpc-graphql/src/schema/type-resolvers/instruction.ts @@ -437,6 +437,13 @@ export const instructionTypeResolvers = { mintAuthority: resolveAccount('mintAuthority'), multisigMintAuthority: resolveAccount('multisigMintAuthority'), }, + SplTokenReallocate: { + account: resolveAccount('account'), + multisigOwner: resolveAccount('multisigOwner'), + owner: resolveAccount('owner'), + payer: resolveAccount('payer'), + systemProgram: resolveAccount('systemProgram'), + }, SplTokenRevokeInstruction: { multisigOwner: resolveAccount('multisigOwner'), owner: resolveAccount('owner'), @@ -953,6 +960,9 @@ export const instructionTypeResolvers = { if (jsonParsedConfigs.instructionType === 'emitTokenMetadata') { return 'SplTokenMetadataEmit'; } + if (jsonParsedConfigs?.instructionType === 'reallocate') { + return 'SplTokenReallocate'; + } } if (jsonParsedConfigs.programName === 'stake') { if (jsonParsedConfigs.instructionType === 'initialize') { diff --git a/packages/rpc-graphql/src/schema/type-resolvers/types.ts b/packages/rpc-graphql/src/schema/type-resolvers/types.ts index b5edd3ae072..53c41e705cc 100644 --- a/packages/rpc-graphql/src/schema/type-resolvers/types.ts +++ b/packages/rpc-graphql/src/schema/type-resolvers/types.ts @@ -62,6 +62,33 @@ export const typeTypeResolvers = { INITIALIZED: 'initialized', UNINITIALIZED: 'uninitialized', }, + SplTokenExtensionType: { + CONFIDENTIAL_TRANSFER_ACCOUNT: 'confidentialTransferAccount', + CONFIDENTIAL_TRANSFER_FEE_AMOUNT: 'confidentialTransferFeeAmount', + CONFIDENTIAL_TRANSFER_FEE_CONFIG: 'confidentialTransferFeeConfig', + CONFIDENTIAL_TRANSFER_MINT: 'confidentialTransferMint', + CPI_GUARD: 'cpiGuard', + DEFAULT_ACCOUNT_STATE: 'defaultAccountState', + GROUP_MEMBER_POINTER: 'groupMemberPointer', + GROUP_POINTER: 'groupPointer', + IMMUTABLE_OWNER: 'immutableOwner', + INTEREST_BEARING_CONFIG: 'interestBearingConfig', + MEMO_TRANSFER: 'memoTransfer', + METADATA_POINTER: 'metadataPointer', + MINT_CLOSE_AUTHORITY: 'mintCloseAuthority', + NON_TRANSFERABLE: 'nonTransferable', + NON_TRANSFERABLE_ACCOUNT: 'nonTransferableAccount', + PERMANENT_DELEGATE: 'permanentDelegate', + TOKEN_GROUP: 'tokenGroup', + TOKEN_GROUP_MEMBER: 'tokenGroupMember', + TOKEN_METADATA: 'tokenMetadata', + TRANSFER_FEE_AMOUNT: 'transferFeeAmount', + TRANSFER_FEE_CONFIG: 'transferFeeConfig', + TRANSFER_HOOK: 'transferHook', + TRANSFER_HOOK_ACCOUNT: 'transferHookAccount', + UNINITIALIZED: 'uninitialized', + UNPARSEABLE_EXTENSION: 'unparseableExtension', + }, TokenBalance: { mint: resolveAccount('mint'), owner: resolveAccount('owner'),