import { generateKeyPairSigner } from '@solana/kit'; import { getAdminCreateFleetInstruction, parseAdminCreateFleetInstruction, } from '../src/generated/instructions/adminCreateFleet'; import { getAdminDepositCargoToFleetInstruction, parseAdminDepositCargoToFleetInstruction, } from '../src/generated/instructions/adminDepositCargoToFleet'; import { getAdminSetNpcFleetIdInstruction, parseAdminSetNpcFleetIdInstruction, } from '../src/generated/instructions/adminSetNpcFleetId'; async function signers(count: number) { return Promise.all( Array.from({ length: count }, () => generateKeyPairSigner()), ); } describe('admin fleet game authority ABI', () => { it('requires separate fleet-owner and Game authority accounts', async () => { const [ owner, gameAdmin, ownerProfile, gameAdminProfile, profileFaction, game, fleet, ] = await signers(7); const instruction = getAdminCreateFleetInstruction({ profileValidationSigner: owner, profileValidationProfile: ownerProfile.address, gameAdminValidationSigner: gameAdmin, gameAdminValidationProfile: gameAdminProfile.address, profileFaction: profileFaction.address, game: game.address, fleet: fleet.address, fleetLabel: 'TEST:game-authority', shipId: 7, shipAmount: 2, sector: [12, -8], keyIndex: 3, gameAdminKeyIndex: 9, }); const parsed = parseAdminCreateFleetInstruction(instruction); expect(instruction.accounts).toHaveLength(12); expect(parsed.accounts.profileValidationSigner.address).toBe(owner.address); expect(parsed.accounts.profileValidationProfile.address).toBe( ownerProfile.address, ); expect(parsed.accounts.gameAdminValidationSigner.address).toBe( gameAdmin.address, ); expect(parsed.accounts.gameAdminValidationProfile.address).toBe( gameAdminProfile.address, ); expect(parsed.accounts.game.address).toBe(game.address); expect(parsed.data.keyIndex).toBe(3); expect(parsed.data.gameAdminKeyIndex).toBe(9); expect(parsed.data.shipId).toBe(7); }); it('requires separate Game authority accounts for direct cargo injection', async () => { const [owner, gameAdmin, ownerProfile, gameAdminProfile, game, fleet] = await signers(6); const instruction = getAdminDepositCargoToFleetInstruction({ profileValidationSigner: owner, profileValidationProfile: ownerProfile.address, gameAdminValidationSigner: gameAdmin, gameAdminValidationProfile: gameAdminProfile.address, game: game.address, fleet: fleet.address, fuelAmount: 100, ammoAmount: 200, keyIndex: 4, gameAdminKeyIndex: 10, }); const parsed = parseAdminDepositCargoToFleetInstruction(instruction); expect(instruction.accounts).toHaveLength(10); expect(parsed.accounts.profileValidationSigner.address).toBe(owner.address); expect(parsed.accounts.gameAdminValidationSigner.address).toBe( gameAdmin.address, ); expect(parsed.accounts.gameAdminValidationProfile.address).toBe( gameAdminProfile.address, ); expect(parsed.accounts.game.address).toBe(game.address); expect(parsed.data.fuelAmount).toBe(100n); expect(parsed.data.ammoAmount).toBe(200n); expect(parsed.data.keyIndex).toBe(4); expect(parsed.data.gameAdminKeyIndex).toBe(10); }); it('requires separate Game authority accounts for NPC designation', async () => { const [ owner, gameAdmin, ownerProfile, gameAdminProfile, game, fleet, factionOwnership, factionAccount, ] = await signers(8); const instruction = getAdminSetNpcFleetIdInstruction({ profileValidationSigner: owner, profileValidationProfile: ownerProfile.address, gameAdminValidationSigner: gameAdmin, gameAdminValidationProfile: gameAdminProfile.address, game: game.address, fleet: fleet.address, factionOwnership: factionOwnership.address, factionAccount: factionAccount.address, npcFactionId: 4, keyIndex: 5, gameAdminKeyIndex: 11, }); const parsed = parseAdminSetNpcFleetIdInstruction(instruction); expect(instruction.accounts).toHaveLength(13); expect(parsed.accounts.profileValidationSigner.address).toBe(owner.address); expect(parsed.accounts.gameAdminValidationSigner.address).toBe( gameAdmin.address, ); expect(parsed.accounts.gameAdminValidationProfile.address).toBe( gameAdminProfile.address, ); expect(parsed.accounts.game.address).toBe(game.address); expect(parsed.accounts.factionOwnership.address).toBe( factionOwnership.address, ); expect(parsed.data.npcFactionId).toBe(4); expect(parsed.data.keyIndex).toBe(5); expect(parsed.data.gameAdminKeyIndex).toBe(11); }); });