import { AccountRole, address, createNoopSigner } from '@solana/kit'; import { describe, expect, it } from 'vitest'; import { getMineAsteroidToRespawnInstruction, parseMineAsteroidToRespawnInstruction, } from '../src/generated/instructions/mineAsteroidToRespawn'; import { SAGE_PROGRAM_ADDRESS } from '../src/generated/programs/sage'; const KEY = address('11111111111111111111111111111111'); const BUDGET = address('SysvarC1ock11111111111111111111111111111111'); const CONFIG = address('SysvarRent111111111111111111111111111111111'); const HYE = address('HYEWZXXzMyrnN89ASYPVHHdFdgvrgV8diFLv6P2wEwFN'); const base = { profileValidationSigner: createNoopSigner(KEY), profileValidationProfile: KEY, character: KEY, fleet: KEY, starSystem: KEY, cssStarSystem: KEY, asteroid: KEY, regionTracker: KEY, game: KEY, currencyCache: KEY, keyIndex: 0, }; describe.each([SAGE_PROGRAM_ADDRESS, HYE])( 'mining recovery ABI (%s)', (programAddress) => { it('appends writable budget and readonly config after the existing 12 accounts', () => { const legacy = getMineAsteroidToRespawnInstruction(base, { programAddress, }); const active = getMineAsteroidToRespawnInstruction( { ...base, xpBudget: BUDGET, xpBudgetConfig: CONFIG, }, { programAddress }, ); expect(active.accounts).toHaveLength(14); expect(active.accounts.slice(0, 12)).toEqual( legacy.accounts.slice(0, 12), ); expect(active.data).toEqual(legacy.data); expect(active.accounts.slice(12)).toEqual([ { address: BUDGET, role: AccountRole.WRITABLE }, { address: CONFIG, role: AccountRole.READONLY }, ]); const parsed = parseMineAsteroidToRespawnInstruction(active); expect(parsed.accounts.xpBudget?.address).toBe(BUDGET); expect(parsed.accounts.xpBudgetConfig?.address).toBe(CONFIG); }); it.each([12, 14])( 'parses legacy/optional tails (%i accounts)', (length) => { const instruction = getMineAsteroidToRespawnInstruction(base, { programAddress, }); const parsed = parseMineAsteroidToRespawnInstruction({ ...instruction, accounts: instruction.accounts.slice(0, length), }); expect(parsed.accounts.currencyCache.address).toBe(KEY); expect(parsed.accounts.xpBudget).toBeUndefined(); expect(parsed.accounts.xpBudgetConfig).toBeUndefined(); expect(() => parseMineAsteroidToRespawnInstruction({ ...instruction, accounts: instruction.accounts.slice(0, 11), }), ).toThrow(); }, ); }, );