@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
122 lines • 4.92 kB
JavaScript
/**
* PDA derivation functions for the SRSLY program
* @module pda/srsly
*/
import { address, getProgramDerivedAddress, getAddressEncoder } from '@solana/kit';
import { getAddresses } from '../utils/config';
import { getSignerAddress } from '../utils/signer';
import { CONFIG_SEED, CONTRACT_SEED, RENTAL_SEED, RENTAL_AUTHORITY_SEED, BORROWER_STATE_SEED, ACTIVE_RENTAL_SEED, QUEUED_RENTAL_SEED, } from './constants';
/**
* Address encoder for PDA seeds
*/
const addressEncoder = getAddressEncoder();
/**
* Text encoder for string seeds
*/
const textEncoder = new TextEncoder();
/**
* Derive the contract PDA from a fleet address
* @param fleet - The fleet public key
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived contract PDA
*/
export async function deriveContract(fleet, programAddress) {
const fleetAddress = getSignerAddress(fleet);
const program = programAddress ? getSignerAddress(programAddress) : address(getAddresses().srsly);
// Encode seeds to bytes
const contractSeedBytes = textEncoder.encode(CONTRACT_SEED);
const fleetBytes = addressEncoder.encode(fleetAddress);
const [pda] = await getProgramDerivedAddress({
programAddress: program,
seeds: [contractSeedBytes, fleetBytes],
});
return pda;
}
/**
* Internal helper to derive a rental PDA with a named seed suffix
*/
async function deriveRentalWithSeed(contract, seedSuffix, programAddress) {
const contractAddress = getSignerAddress(contract);
const program = programAddress ? getSignerAddress(programAddress) : address(getAddresses().srsly);
const rentalSeedBytes = textEncoder.encode(RENTAL_SEED);
const contractBytes = addressEncoder.encode(contractAddress);
const suffixBytes = textEncoder.encode(seedSuffix);
const [pda] = await getProgramDerivedAddress({
programAddress: program,
seeds: [rentalSeedBytes, contractBytes, suffixBytes],
});
return pda;
}
/**
* Derive the active rental PDA from contract address
*
* Seeds: ["rental_state", contract, "active"]
*
* @param contract - The contract public key
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived active rental PDA
*/
export async function deriveActiveRental(contract, programAddress) {
return deriveRentalWithSeed(contract, ACTIVE_RENTAL_SEED, programAddress);
}
/**
* Derive the queued rental PDA from contract address
*
* Seeds: ["rental_state", contract, "queued"]
*
* @param contract - The contract public key
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived queued rental PDA
*/
export async function deriveQueuedRental(contract, programAddress) {
return deriveRentalWithSeed(contract, QUEUED_RENTAL_SEED, programAddress);
}
/**
* Derive the rental authority PDA
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived rental authority PDA
*/
export async function deriveRentalAuthority(programAddress) {
const program = programAddress ? getSignerAddress(programAddress) : address(getAddresses().srsly);
// Encode seeds to bytes
const rentalAuthoritySeedBytes = textEncoder.encode(RENTAL_AUTHORITY_SEED);
const [pda] = await getProgramDerivedAddress({
programAddress: program,
seeds: [rentalAuthoritySeedBytes],
});
return pda;
}
/**
* Derive the borrower state PDA from a borrower address
* @param borrower - The borrower public key
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived borrower state PDA
*/
export async function deriveBorrowerState(borrower, programAddress) {
const borrowerAddress = getSignerAddress(borrower);
const program = programAddress ? getSignerAddress(programAddress) : address(getAddresses().srsly);
// Encode seeds to bytes
const borrowerStateSeedBytes = textEncoder.encode(BORROWER_STATE_SEED);
const borrowerBytes = addressEncoder.encode(borrowerAddress);
const [pda] = await getProgramDerivedAddress({
programAddress: program,
seeds: [borrowerStateSeedBytes, borrowerBytes],
});
return pda;
}
/**
* Derive the config PDA
* @param programAddress - Optional SRSLY program address (defaults to network-specific address)
* @returns The derived config PDA
*/
export async function deriveConfig(programAddress) {
const program = programAddress ? getSignerAddress(programAddress) : address(getAddresses().srsly);
// Encode seeds to bytes
const configSeedBytes = textEncoder.encode(CONFIG_SEED);
const [pda] = await getProgramDerivedAddress({
programAddress: program,
seeds: [configSeedBytes],
});
return pda;
}
//# sourceMappingURL=srsly.js.map