From 56bd04fb38f82c275fd2269a4ac776d8af57724b Mon Sep 17 00:00:00 2001 From: Raushan kumar Date: Mon, 12 Jan 2026 18:33:56 +0000 Subject: [PATCH 1/2] feat: add validator scripts and assign instruction test --- clients/js/test/assign.test.ts | 54 ++++++++++++++++++++++++++++++++++ package.json | 5 +++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 clients/js/test/assign.test.ts diff --git a/clients/js/test/assign.test.ts b/clients/js/test/assign.test.ts new file mode 100644 index 0000000..3a6cb6c --- /dev/null +++ b/clients/js/test/assign.test.ts @@ -0,0 +1,54 @@ +import { appendTransactionMessageInstruction, fetchEncodedAccount, generateKeyPairSigner, pipe } from '@solana/kit'; +import { it, expect } from 'vitest'; +import { SYSTEM_PROGRAM_ADDRESS, getAssignInstruction, getCreateAccountInstruction } from '../src'; +import { + createDefaultSolanaClient, + createDefaultTransaction, + generateKeyPairSignerWithSol, + signAndSendTransaction, +} from './_setup'; + +it('assigns a new owner to an account', async () => { + // 1. Setup client and payer. + const client = createDefaultSolanaClient(); + const [payer, accountToAssign, newOwner] = await Promise.all([ + generateKeyPairSignerWithSol(client), + generateKeyPairSigner(), + generateKeyPairSigner(), + ]); + + // 2. Create the account first (so it exists on-chain). + // The account needs to exist to be assigned. + const space = 0n; + const lamports = await client.rpc.getMinimumBalanceForRentExemption(space).send(); + + const createAccount = getCreateAccountInstruction({ + payer, + newAccount: accountToAssign, + lamports: lamports, // Fix: Use return value directly + space, + programAddress: SYSTEM_PROGRAM_ADDRESS, + }); + + // 3. Use getAssignInstruction to change the owner of accountToAssign to newOwner. + const assign = getAssignInstruction({ + account: accountToAssign, + programAddress: newOwner.address, + }); + + // 4. Sign and send the transaction. + await pipe( + await createDefaultTransaction(client, payer), + tx => appendTransactionMessageInstruction(createAccount, tx), + tx => appendTransactionMessageInstruction(assign, tx), + tx => signAndSendTransaction(client, tx), + ); + + // 5. Fetch the account data and verify the owner. + const fetchedAccount = await fetchEncodedAccount(client.rpc, accountToAssign.address); + // In solana/kit, 'programAddress' is the field for the account owner. + expect(fetchedAccount).toMatchObject({ + exists: true, + programAddress: newOwner.address, + }); +}); diff --git a/package.json b/package.json index 7dd5ae5..8962646 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,10 @@ "private": true, "scripts": { "generate": "pnpm generate:clients", - "generate:clients": "codama run --all" + "generate:clients": "codama run --all", + "validator:start": "solana-test-validator --reset --quiet", + "validator:stop": "pkill -f solana-test-validator", + "validator:restart": "pnpm validator:stop && pnpm validator:start" }, "devDependencies": { "@codama/renderers-js": "^1.5.5", From 212a8918312520e615258337a160c91dcbbab283 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Wed, 21 Jan 2026 14:18:23 +0000 Subject: [PATCH 2/2] chore: address maintainer feedback --- clients/js/test/assign.test.ts | 14 ++++++-------- package.json | 5 +---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/clients/js/test/assign.test.ts b/clients/js/test/assign.test.ts index 3a6cb6c..51cfa0f 100644 --- a/clients/js/test/assign.test.ts +++ b/clients/js/test/assign.test.ts @@ -1,6 +1,6 @@ import { appendTransactionMessageInstruction, fetchEncodedAccount, generateKeyPairSigner, pipe } from '@solana/kit'; import { it, expect } from 'vitest'; -import { SYSTEM_PROGRAM_ADDRESS, getAssignInstruction, getCreateAccountInstruction } from '../src'; +import { SYSTEM_PROGRAM_ADDRESS, getAssignInstruction, getTransferSolInstruction } from '../src'; import { createDefaultSolanaClient, createDefaultTransaction, @@ -22,12 +22,10 @@ it('assigns a new owner to an account', async () => { const space = 0n; const lamports = await client.rpc.getMinimumBalanceForRentExemption(space).send(); - const createAccount = getCreateAccountInstruction({ - payer, - newAccount: accountToAssign, - lamports: lamports, // Fix: Use return value directly - space, - programAddress: SYSTEM_PROGRAM_ADDRESS, + const transfer = getTransferSolInstruction({ + source: payer, + destination: accountToAssign.address, + amount: lamports, }); // 3. Use getAssignInstruction to change the owner of accountToAssign to newOwner. @@ -39,7 +37,7 @@ it('assigns a new owner to an account', async () => { // 4. Sign and send the transaction. await pipe( await createDefaultTransaction(client, payer), - tx => appendTransactionMessageInstruction(createAccount, tx), + tx => appendTransactionMessageInstruction(transfer, tx), tx => appendTransactionMessageInstruction(assign, tx), tx => signAndSendTransaction(client, tx), ); diff --git a/package.json b/package.json index 8962646..7dd5ae5 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,7 @@ "private": true, "scripts": { "generate": "pnpm generate:clients", - "generate:clients": "codama run --all", - "validator:start": "solana-test-validator --reset --quiet", - "validator:stop": "pkill -f solana-test-validator", - "validator:restart": "pnpm validator:stop && pnpm validator:start" + "generate:clients": "codama run --all" }, "devDependencies": { "@codama/renderers-js": "^1.5.5",