Skip to content

Creates a new Settings account that stores verification configuration. The caller becomes the admin of the account.

pub fn initialize_settings(
ctx: Context<InitializeSettings>,
range_signer: Pubkey,
window_size: u64,
) -> Result<()>
ParameterTypeDescription
range_signerPubkeyPublic key of the trusted backend signer
window_sizeu64Time window (seconds) for timestamp validation
AccountTypeDescription
adminSignerThe admin who will own this Settings account
settingsAccount<Settings>PDA to be initialized (derived from admin)
system_programProgram<System>System program for account creation
const [settingsPda] = PublicKey.findProgramAddressSync(
[Buffer.from("settings"), admin.toBuffer()],
RANGE_PROGRAM_ID
);
import { buildInitializeSettingsInstruction } from './codama-ts-range-custom';
const instruction = await buildInitializeSettingsInstruction({
admin: walletPublicKey,
rangeSigner: backendSignerPublicKey,
windowSize: 60n, // 60 seconds
});
// Sign and send transaction
const transaction = new Transaction().add(instruction);
await sendTransaction(transaction);
await program.methods
.initializeSettings(rangeSigner, new BN(60))
.accounts({
admin: wallet.publicKey,
settings: settingsPda,
systemProgram: SystemProgram.programId,
})
.rpc();
  1. Derives Settings PDA from ["settings", admin.key()]
  2. Creates the Settings account with initial values
  3. Sets caller as admin
  4. Stores provided range_signer and window_size
ErrorCause
Account already existsSettings already initialized for this admin
Insufficient fundsAdmin doesn’t have enough SOL for rent
import { Connection, Keypair, Transaction } from '@solana/web3.js';
import { buildInitializeSettingsInstruction } from './codama-ts-range-custom';
async function initializeSettings() {
const connection = new Connection('https://api.devnet.solana.com');
// Admin keypair (you)
const admin = Keypair.generate();
// Backend signer keypair (keep this secure on your backend)
const rangeSigner = Keypair.generate();
const instruction = await buildInitializeSettingsInstruction({
admin: admin.publicKey,
rangeSigner: rangeSigner.publicKey,
windowSize: 60n, // 60 second validity window
});
const transaction = new Transaction().add(instruction);
transaction.feePayer = admin.publicKey;
transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
transaction.sign(admin);
const signature = await connection.sendRawTransaction(transaction.serialize());
console.log('Settings initialized:', signature);
console.log('Save your range_signer private key securely!');
return { admin, rangeSigner };
}