UNPKG

@wuwei-labs/srsly

Version:
160 lines 7.29 kB
"use strict"; /** * PDA derivation functions for SAGE and Profile Faction programs * @module pda/sage */ Object.defineProperty(exports, "__esModule", { value: true }); exports.deriveProfileFaction = deriveProfileFaction; exports.deriveSagePlayerProfile = deriveSagePlayerProfile; exports.deriveStarbase = deriveStarbase; exports.deriveStarbasePlayer = deriveStarbasePlayer; exports.deriveGameAccounts = deriveGameAccounts; const kit_1 = require("@solana/kit"); const config_1 = require("../utils/config"); const signer_1 = require("../utils/signer"); const constants_1 = require("./constants"); /** * Address encoder for PDA seeds */ const addressEncoder = (0, kit_1.getAddressEncoder)(); /** * Text encoder for string seeds */ const textEncoder = new TextEncoder(); /** * Derive the profile faction PDA from a profile address * @param profile - The player profile public key * @param programAddress - Optional Profile Faction program address (defaults to network-specific address) * @returns The derived profile faction PDA */ async function deriveProfileFaction(profile, programAddress) { const profileAddress = (0, signer_1.getSignerAddress)(profile); const program = programAddress ? (0, signer_1.getSignerAddress)(programAddress) : (0, kit_1.address)((0, config_1.getAddresses)().profileFaction); // Encode seeds to bytes const profileFactionSeedBytes = textEncoder.encode(constants_1.PROFILE_FACTION_SEED); const profileBytes = addressEncoder.encode(profileAddress); const [pda] = await (0, kit_1.getProgramDerivedAddress)({ programAddress: program, seeds: [profileFactionSeedBytes, profileBytes], }); return pda; } /** * Derive the SAGE player profile PDA * @param profile - The player profile public key * @param gameId - The game ID public key * @param programAddress - Optional SAGE program address (defaults to network-specific address) * @returns The derived SAGE player profile PDA */ async function deriveSagePlayerProfile(profile, gameId, programAddress) { const profileAddress = (0, signer_1.getSignerAddress)(profile); const gameIdAddress = (0, signer_1.getSignerAddress)(gameId); const program = programAddress ? (0, signer_1.getSignerAddress)(programAddress) : (0, kit_1.address)((0, config_1.getAddresses)().sage); // Encode seeds to bytes const sagePlayerProfileSeedBytes = textEncoder.encode(constants_1.SAGE_PLAYER_PROFILE_SEED); const profileBytes = addressEncoder.encode(profileAddress); const gameIdBytes = addressEncoder.encode(gameIdAddress); const [pda] = await (0, kit_1.getProgramDerivedAddress)({ programAddress: program, seeds: [sagePlayerProfileSeedBytes, profileBytes, gameIdBytes], }); return pda; } /** * Derive the starbase PDA from faction and game ID * @param faction - Faction name ('mud', 'oni', 'ustur') or faction ID (1, 2, 3) * @param gameId - The game ID public key * @param programAddress - Optional SAGE program address (defaults to network-specific address) * @returns The derived starbase PDA */ async function deriveStarbase(faction, gameId, programAddress) { const factionName = typeof faction === 'number' ? (0, constants_1.getFactionName)(faction) : faction; const coords = (0, constants_1.getFactionCoordinates)(factionName); const gameIdAddress = (0, signer_1.getSignerAddress)(gameId); const program = programAddress ? (0, signer_1.getSignerAddress)(programAddress) : (0, kit_1.address)((0, config_1.getAddresses)().sage); // Encode string and address seeds to bytes const starbaseSeedBytes = textEncoder.encode(constants_1.STARBASE_SEED); const gameIdBytes = addressEncoder.encode(gameIdAddress); // Convert coordinates to little-endian bytes const xBuffer = new ArrayBuffer(8); const xView = new DataView(xBuffer); xView.setBigInt64(0, BigInt(coords.x), true); // true = little endian const yBuffer = new ArrayBuffer(8); const yView = new DataView(yBuffer); yView.setBigInt64(0, BigInt(coords.y), true); // true = little endian const [pda] = await (0, kit_1.getProgramDerivedAddress)({ programAddress: program, seeds: [starbaseSeedBytes, gameIdBytes, new Uint8Array(xBuffer), new Uint8Array(yBuffer)], }); return pda; } /** * Derive the starbase player PDA * @param sagePlayerProfile - The SAGE player profile public key * @param starbase - The starbase public key * @param starbaseSeqId - Optional starbase sequence ID (defaults to 0) * @param programAddress - Optional SAGE program address (defaults to network-specific address) * @returns The derived starbase player PDA */ async function deriveStarbasePlayer(sagePlayerProfile, starbase, starbaseSeqId = 0, programAddress) { const profileAddress = (0, signer_1.getSignerAddress)(sagePlayerProfile); const starbaseAddress = (0, signer_1.getSignerAddress)(starbase); const program = programAddress ? (0, signer_1.getSignerAddress)(programAddress) : (0, kit_1.address)((0, config_1.getAddresses)().sage); // Encode string and address seeds to bytes const starbasePlayerSeedBytes = textEncoder.encode(constants_1.STARBASE_PLAYER_SEED); const profileBytes = addressEncoder.encode(profileAddress); const starbaseBytes = addressEncoder.encode(starbaseAddress); // Convert sequence ID to little-endian u16 bytes const seqBuffer = new ArrayBuffer(2); const seqView = new DataView(seqBuffer); seqView.setUint16(0, starbaseSeqId, true); // true = little endian const [pda] = await (0, kit_1.getProgramDerivedAddress)({ programAddress: program, seeds: [starbasePlayerSeedBytes, profileBytes, starbaseBytes, new Uint8Array(seqBuffer)], }); return pda; } /** * Derive all SAGE game accounts at once (convenience function) * * This is a helper that derives all three SAGE-related accounts needed for most operations: * - Profile faction (from Profile Faction program) * - SAGE player profile (from SAGE program) * - Starbase (from SAGE program using faction coordinates) * - Starbase player (from SAGE program) * * @param profile - The player profile public key * @param faction - Faction name ('mud', 'oni', 'ustur') or faction ID (1, 2, 3) * @param gameId - The game ID public key * @param starbaseSeqId - Optional starbase sequence ID (defaults to 0) * @returns Object containing all derived SAGE accounts * * @example * ```typescript * const accounts = await deriveGameAccounts( * playerProfile, * 'mud', * gameId * ); * // Returns: { profileFaction, sagePlayerProfile, starbase, starbasePlayer } * ``` */ async function deriveGameAccounts(profile, faction, gameId, starbaseSeqId = 0) { // Derive all accounts const [profileFaction, sagePlayerProfile, starbase] = await Promise.all([ deriveProfileFaction(profile), deriveSagePlayerProfile(profile, gameId), deriveStarbase(faction, gameId), ]); // Derive starbase player (depends on sagePlayerProfile and starbase) const starbasePlayer = await deriveStarbasePlayer(sagePlayerProfile, starbase, starbaseSeqId); return { profileFaction, sagePlayerProfile, starbase, starbasePlayer, }; } //# sourceMappingURL=sage.js.map